做STC8G1K08A-8Pin芯片的485数据收发,使用STC官方的库编程比较方便。调试的时候数据收发始终不正常,想达到的目的是外部发送两个字节的数据,第一个是A6握手数据,另一个任意数据。芯片接收并识别到握手数据后,回送收到的字节数与第二个任意数据。就这么简单的一个小程序,搞了半天都没搞定。后来为了验证程序的正确性干脆把程序移植到了STC8G1K08-16Pin管脚的芯片上数据收发却 是正常的。这是为何?下面是STC8G1K08A-8Pin的程序仿真测试:程序执行发送“L、B、H”三个字符,调用发送函数实参装入正确但到赋值给SBUF却是零,另外中断接收到的数据也是错误的,怀疑是波特率错误,特意把时钟从P5.5输出用示波器查看频率有点小误差是22.107M,但16Pin的芯片频率也是如此。不知道 问题在什么地方。
单片机源程序如下:
- #include "config.h"
- #include "GPIO.h"
- #include "UART.h"
- /************************ 485通讯与IO口配置 ****************************/
- void GPIO_config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //结构定义
- //初始化串口管脚
- GPIO_InitStructure.Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //指定要初始化的IO
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO上拉准双向输入或输出方式
- GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
- //初始化UART1映射管脚
- GPIO_InitStructure.Pin = GPIO_Pin_4|GPIO_Pin_5; //指定要初始化的IO, GPIO_Pin_4
- GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO上拉准双向输入或输出方式
- GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
- //初始化485芯片的使能控制管脚
- GPIO_InitStructure.Pin = GPIO_Pin_3; //指定要初始化的IO, GPIO_Pin_0 GPIO_Pin_1
- GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO推挽的输入或输出方式
- GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
-
- }
- void UART_config(void)
- {
- COMx_InitDefine COMx_InitStructure; //结构定义
- COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式,
- COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //使用Timer1做波特率发生器,
- COMx_InitStructure.UART_BaudRate = 9600ul; //波特率, 一般 110 ~ 115200
- COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许,
- COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍,
- COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许,
- COMx_InitStructure.UART_Priority = Priority_0; //指定中断优先级(低到高)
- UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1
- }
- void delayms(unsigned int ms)
- {
- unsigned int i,j;
- for(i = 0; i < ms; i++)
- for(j = 0; j < 100; j++);
- }
- /******************** 主函数**************************/
- void main(void)
- {
- GPIO_config();
- UART_config();
- TX1_write2buff(0x4C); //"L"发送回送数据
- TX1_write2buff(0x42); //"B"发送回送数据
- TX1_write2buff(0x48); //"H"发送回送数据
-
- P_SW1 = 0x84; //UART1配置映射到P5.5与P5.4脚,SPI配置缺失
- RS485_EN = 0; //使485通讯使能在接收状态
- EA = 1; //开放所有中断
-
- while(1)
- {
- if(COM1.B_RX_OK == 1 && RX1_Buffer[0] == 0xa6) //判断接收标志
- {
- delayms(200);
- TX1_write2buff(COM1.RX_Cnt); //回送收到的数据长度
- TX1_write2buff(RX1_Buffer[1]); //回送收到的数据
- COM1.B_RX_OK = 0; //清除标志
- COM1.RX_Cnt = 0; //清除数据长度
- }
- }
-
- }
复制代码
485测试程序.rar
(205.25 KB, 下载次数: 7)
|