標(biāo)題:
STC單片機(jī)芯片調(diào)試,這RS485數(shù)據(jù)收發(fā)見鬼了
[打印本頁]
作者:
wjw7680
時間:
2023-3-11 13:28
標(biāo)題:
STC單片機(jī)芯片調(diào)試,這RS485數(shù)據(jù)收發(fā)見鬼了
做STC8G1K08A-8Pin芯片的485數(shù)據(jù)收發(fā),使用STC官方的庫編程比較方便。調(diào)試的時候數(shù)據(jù)收發(fā)始終不正常,想達(dá)到的目的是外部發(fā)送兩個字節(jié)的數(shù)據(jù),第一個是A6握手?jǐn)?shù)據(jù),另一個任意數(shù)據(jù)。芯片接收并識別到握手?jǐn)?shù)據(jù)后,回送收到的字節(jié)數(shù)與第二個任意數(shù)據(jù)。就這么簡單的一個小程序,搞了半天都沒搞定。后來為了驗(yàn)證程序的正確性干脆把程序移植到了
STC8G1K08-16Pin管腳的芯片上數(shù)據(jù)收發(fā)卻 是正常的。這是為何?下面是
STC8G1K08A-8Pin的程序
仿真測試:程序執(zhí)行發(fā)送“L、B、H”三個字符,調(diào)用發(fā)送函數(shù)實(shí)參裝入正確但到賦值給SBUF卻是零,另外中斷接收到的數(shù)據(jù)也是錯誤的,懷疑是波特率錯誤,特意把時鐘從P5.5輸出用示波器查看頻率有點(diǎn)小誤差是22.107M,但16Pin的芯片頻率也是如此。不知道 問題在什么地方。
單片機(jī)源程序如下:
#include "config.h"
#include "GPIO.h"
#include "UART.h"
/************************ 485通訊與IO口配置 ****************************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //結(jié)構(gòu)定義
//初始化串口管腳
GPIO_InitStructure.Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //指定要初始化的IO
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO上拉準(zhǔn)雙向輸入或輸出方式
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上拉準(zhǔn)雙向輸入或輸出方式
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; //結(jié)構(gòu)定義
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式,
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //使用Timer1做波特率發(fā)生器,
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; //指定中斷優(yōu)先級(低到高)
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++);
}
/******************** 主函數(shù)**************************/
void main(void)
{
GPIO_config();
UART_config();
TX1_write2buff(0x4C); //"L"發(fā)送回送數(shù)據(jù)
TX1_write2buff(0x42); //"B"發(fā)送回送數(shù)據(jù)
TX1_write2buff(0x48); //"H"發(fā)送回送數(shù)據(jù)
P_SW1 = 0x84; //UART1配置映射到P5.5與P5.4腳,SPI配置缺失
RS485_EN = 0; //使485通訊使能在接收狀態(tài)
EA = 1; //開放所有中斷
while(1)
{
if(COM1.B_RX_OK == 1 && RX1_Buffer[0] == 0xa6) //判斷接收標(biāo)志
{
delayms(200);
TX1_write2buff(COM1.RX_Cnt); //回送收到的數(shù)據(jù)長度
TX1_write2buff(RX1_Buffer[1]); //回送收到的數(shù)據(jù)
COM1.B_RX_OK = 0; //清除標(biāo)志
COM1.RX_Cnt = 0; //清除數(shù)據(jù)長度
}
}
}
復(fù)制代碼
485測試程序.rar
(205.25 KB, 下載次數(shù): 7)
2023-3-11 13:25 上傳
點(diǎn)擊文件名下載附件
作者:
gongnn
時間:
2023-3-11 14:40
收發(fā)狀態(tài)切換的時候得加延時。
作者:
wjw7680
時間:
2023-3-11 15:13
gongnn 發(fā)表于 2023-3-11 14:40
收發(fā)狀態(tài)切換的時候得加延時。
試過了,不行。這個程序移植到STC8G1K08-16Pin上沒問題,收發(fā)切換不用加任何延遲。但在8pin芯片上不行。
作者:
coody_sz
時間:
2023-3-13 11:18
RS485只是一個傳輸硬件,對于單片機(jī)來說,還是串口,沒區(qū)別,只多了一個IO控制方向。
作者:
15031773670
時間:
2023-4-9 20:57
可能需要中斷處理,你的代碼看不懂。建議9600 115200 11M sscom5.13.1
作者:
大漠孤煙001
時間:
2023-4-9 22:44
用 STC-USB Link1D 仿真下就容易看到問題了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1