问答

汇集网友智慧,解决技术难题

21ic问答首页 - 赛元SC92F8463B的SSI中使用UART1与其他芯片通信问题

单片机 嵌入式 赛元 UART1 SC92F

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

代码如下,程序没有报错,想实现的目的是,通过UART1发送A5 5A 00H给另外的芯片,发送成功会有声音响起,但是没有反应,烦请路过的大佬帮忙看看,不胜感激!
#include "Function_Init.H"
#include "stdio.H"

//选择三合一模式:
#define  Uart1  0
#define  TWI    1
#define  SPI    2

#define  SSI_Mode  Uart1

void Uart1_Init(uint Freq,unsigned long int baud);
void UART1_SendByte(unsigned char dat);
void Delay_ms(unsigned int ms);

bit Uart1SendFlag = 0;    //Uart发送中断标志位
bit Uart1ReceiveFlag = 0; //Uart接收中断标志位

// 主函数
void main(void)
{
    // 初始化UART1
    Uart1_Init(20,460800);

    // 延时确保硬件稳定
    Delay_ms(100);

    // 发送控制指令 A5 5A 00 播放第一首歌曲
        UART1_SendByte(0x00); //唤醒信号
                Delay_ms(100);
    UART1_SendByte(0xA5);
                Delay_ms(100);
    UART1_SendByte(0x5A);
                Delay_ms(100);
    UART1_SendByte(0x00);
                Delay_ms(100);
    while(1)
    {
        // 主循环中可以添加其他功能
    }
}

void Uart1_Init(uint Freq,unsigned long int baud)
{
        P2CON &= 0xFC;   //TX/RX设置为输入带上拉
        P2PH  |= 0x03;
       
        OTCON |= 0xC0;    //串行接口SSI选择Uart1通信
        SSCON0 = 0x50;   //设置通信方式为模式一,允许接收
        SSCON1 = Freq*1000000/baud;   //波特率低位控制
        SSCON2 = (Freq*1000000/baud)>>8;   //波特率高位控制
        IE1 |= 0x01;      //开启SSI中断
  EA = 1;       

        TMCON = 0X07;    //------111 ;Timer0、Tiemr1和Tiemr2选择时钟Fsys
        TMOD |= 0x20;            //0010 0000;Timer1设置工作方式2
        TL1 = 0xFC;   //溢出时间:时钟为Fsys,则240*(1/Fsys)=20us;
        TH1 = 0xFC;
        TR1 = 0;
        ET1 = 1;//定时器1允许
        TR1 = 1;//打开定时器1
}

void Uart1_Int() interrupt 7   //Uart1中断函数
{
        if(SSCON0&0x02)    //发送标志位判断
        {
                SSCON0 &= 0xFD;
                Uart1SendFlag = 1;
        }
        if((SSCON0&0x01))  //接收标志位判断
        {
                SSCON0 &= 0xFE;
                Uart1ReceiveFlag = 1;
        }       
}

void UART1_SendByte(unsigned char dat)
{
    TB8 = 0;            // 第9位数据设为0 (通常用于奇偶校验,这里不用)
    SBUF = dat;         // 将数据放入发送缓冲区
    while(!TI);         // 等待发送完成
    TI = 0;             // 清除发送中断标志
}

// 简单延时函数
void Delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 2000; j++);  // 调整循环次数适应20MHz时钟
}

回答 +关注 1
151人浏览 3人回答问题 分享 举报
3 个回答
  • 赛元SC92F8463B用的人很少啊,个人建议检查一下串口发送数据是否正确。
  • 那你得先排查MCU的串口数据是否已经正常发送出去,可以按如下方法验证一下:

  • 本帖最后由 yueguang3048 于 2025-6-20 09:33 编辑

    1.假设你的发送函数UART1_SendByte是OK的,删除你里面的这堆延时函数 ;

        // 发送控制指令 A5 5A 00 播放第一首歌曲
        UART1_SendByte(0xA5);
        UART1_SendByte(0x5A);
        UART1_SendByte(0x00);

    2.检查UART1_SendByte函数是否写的有问题;
    3.找个USB转串口,在电脑上用串口助手看下你发送的是否是正确的数据;


您需要登录后才可以回复 登录 | 注册