打印

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

[复制链接]
178|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2025-6-21 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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


关键问题分析

  1. 波特率计算错误原代码中 SSCON1SSCON2的计算方式错误,导致实际波特率与目标值(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作为同步头,后接命令和校验。


修正后的代码

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

调试建议

  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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1113

主题

4251

帖子

7

粉丝