丙丁先生 发表于 2025-6-21 19:04

赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题”

# 赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题



根据您提供的代码和问题描述,以下是对SC92F8463B单片机UART1通信问题的分析和解决方案:

---

### **关键问题分析**

1. **波特率计算错误**原代码中 `SSCON1`和 `SSCON2`的计算方式错误,导致实际波特率与目标值(460800)偏差较大。正确的计算需基于芯片手册的波特率公式,通常为:\[
   \text{波特率} = \frac{\text{Fsys}}{(SSCON1 + 1) + 256 \times SSCON2}
   \]修正后计算示例(Fsys=20MHz, Baud=460800):

   - `SSCON1 = 42`(0x2A)
   - `SSCON2 = 0`(0x00)
   实际波特率约为465k,误差在可接受范围内。
2. **定时器1干扰**原代码中启用了定时器1,可能与UART波特率生成冲突。建议关闭定时器1以避免干扰。
3. **引脚配置和模式设置**

   - 确保UART的TX/RX引脚(如P2.0/P2.1)配置为输入带上拉。
   - 检查 `OTCON`寄存器设置是否正确选择UART模式(如 `OTCON |= 0xC0`)。
4. **数据协议不匹配**
   发送顺序 `0x00, 0xA5, 0x5A, 0x00`可能不符合目标设备的协议要求。建议调整为 `0xA5, 0x5A`作为同步头,后接命令和校验。

---

### **修正后的代码**

```c
#include "Function_Init.H"
#include "stdio.H"

// 模式定义:UART1
#defineUart10
#defineSSI_ModeUart1

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时钟
}
```

---

### **调试建议**

1. **硬件检查**

   - 确认TX/RX引脚连接正确(如P2.0/P2.1)。
   - 若使用RS485,确保DE/RE引脚控制正确(发送时DE=1,接收时RE=1)。
   - 检查共地和电源稳定性。
2. **逻辑分析**

   - 使用示波器或逻辑分析仪观察TX波形,验证波特率和数据正确性。
   - 检查RX引脚是否有应答信号(如ACK或反馈数据)。
3. **协议验证**

   - 确认目标设备的通信协议(如同步头、命令格式、校验和)。
   - 根据协议调整发送数据顺序和内容。
4. **简化测试**

   - 尝试发送单一字节(如0xAA),验证基础通信功能。
   - 逐步增加数据长度和协议复杂度。

---

### **总结**

主要问题为波特率计算错误和定时器干扰,修正后可恢复正常通信。若仍无反应,需进一步检查硬件连接和协议匹配。建议通过示波器确认信号完整性,并参考目标设备的数据手册验证通信协议。

丙丁先生 发表于 2025-6-21 19:04

”赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题“https://bbs.21ic.com/icview-3463524-1-1.html
页: [1]
查看完整版本: 赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题”