赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题
根据您提供的代码和问题描述,以下是对SC92F8463B单片机UART1通信问题的分析和解决方案:
关键问题分析
-
波特率计算错误原代码中 SSCON1 和 SSCON2 的计算方式错误,导致实际波特率与目标值(460800)偏差较大。正确的计算需基于芯片手册的波特率公式,通常为:[
\text{波特率} = \frac{\text{Fsys}}{(SSCON1 + 1) + 256 \times SSCON2}
]修正后计算示例(Fsys=20MHz, Baud=460800):
SSCON1 = 42 (0x2A)
SSCON2 = 0 (0x00)
实际波特率约为465k,误差在可接受范围内。
-
定时器1干扰原代码中启用了定时器1,可能与UART波特率生成冲突。建议关闭定时器1以避免干扰。
-
引脚配置和模式设置
- 确保UART的TX/RX引脚(如P2.0/P2.1)配置为输入带上拉。
- 检查
OTCON 寄存器设置是否正确选择UART模式(如 OTCON |= 0xC0 )。
-
数据协议不匹配
发送顺序 0x00, 0xA5, 0x5A, 0x00 可能不符合目标设备的协议要求。建议调整为 0xA5, 0x5A 作为同步头,后接命令和校验。
修正后的代码
#include "Function_Init.H"
#include "stdio.H"
// 模式定义:UART1
#define Uart1 0
#define SSI_Mode Uart1
void Uart1_Init(uint Freq, unsigned long baud);
void UART1_SendByte(unsigned char dat);
void Delay_ms(unsigned int ms);
bit Uart1SendFlag = 0; // 发送中断标志
bit Uart1ReceiveFlag = 0; // 接收中断标志
// 主函数
void main(void)
{
Uart1_Init(20, 460800); // 初始化UART1
Delay_ms(100); // 稳定延时
// 发送指令:A5 5A 00(同步头+命令)
UART1_SendByte(0xA5);
Delay_ms(10);
UART1_SendByte(0x5A);
Delay_ms(10);
UART1_SendByte(0x00); // 命令字节
while(1)
{
// 主循环可扩展其他功能
}
}
// UART1初始化
void Uart1_Init(uint Freq, unsigned long baud)
{
// 配置TX/RX引脚为输入带上拉
P2CON &= 0xFC; // 清空P2.0和P2.1控制位
P2PH |= 0x03; // 设置上拉
OTCON |= 0xC0; // 选择UART1模式
SSCON0 = 0x50; // 模式1,允许接收
// 计算并设置波特率
unsigned long temp = Freq * 1000000 / baud;
SSCON1 = (unsigned char)(temp - 1); // 低位
SSCON2 = (unsigned char)(temp >> 8); // 高位
IE1 |= 0x01; // 开启UART中断
EA = 1; // 全局中断使能
}
// UART1中断服务函数
void Uart1_Int() interrupt 7
{
if(SSCON0 & 0x02) // 发送完成
{
SSCON0 &= ~0x02; // 清除发送标志
Uart1SendFlag = 1;
}
if(SSCON0 & 0x01) // 接收完成
{
SSCON0 &= ~0x01; // 清除接收标志
Uart1ReceiveFlag = 1;
}
}
// 发送字节函数
void UART1_SendByte(unsigned char dat)
{
SBUF = dat; // 写入发送缓冲区
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志
}
// 简易延时函数
void Delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 0; j < 2000; j++); // 适配20MHz时钟
}
调试建议
-
硬件检查
- 确认TX/RX引脚连接正确(如P2.0/P2.1)。
- 若使用RS485,确保DE/RE引脚控制正确(发送时DE=1,接收时RE=1)。
- 检查共地和电源稳定性。
-
逻辑分析
- 使用示波器或逻辑分析仪观察TX波形,验证波特率和数据正确性。
- 检查RX引脚是否有应答信号(如ACK或反馈数据)。
-
协议验证
- 确认目标设备的通信协议(如同步头、命令格式、校验和)。
- 根据协议调整发送数据顺序和内容。
-
简化测试
- 尝试发送单一字节(如0xAA),验证基础通信功能。
- 逐步增加数据长度和协议复杂度。
总结
主要问题为波特率计算错误和定时器干扰,修正后可恢复正常通信。若仍无反应,需进一步检查硬件连接和协议匹配。建议通过示波器确认信号完整性,并参考目标设备的数据手册验证通信协议。 |