目录

TMS320F28P550SJ9学习笔记7结构体寄存器方式配置SCI通信收发_SCI通信收发测试

TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试

今日尝试自己操作寄存器编写函数,使用SCI通信外设 发送与接收数据

文章提供测试代码讲解、完整工程下载、测试效果图


添加创建自己的库文件:

这里提一笔怎么添加创建自己的库文件:

直接右键添加 Header File 和 Source File 就行了,文件后缀.c与.h别忘了自己加上

创建的.h文件会自己给你加上 编译条件语句

https://i-blog.csdnimg.cn/direct/1f64d436d24f4203aedf718af3de74f3.png

之前想给主文件写个.h文件的,这在keil的操作是合法的,但在ccs这会胡乱报错,不知为何

编写SCI发送函数:

下面是我写的三个SCI发送函数的具体实现,分别是发送一个字节、发送一串字符串 、以及自定义的SCI_printf函数


// SCIA 发送一个字节
void SCIa_TransmitData(uint16_t data)
{
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
    {
        //考虑添加超时逻辑
    }
    SciaRegs.SCITXBUF.all = data;
}

//SCIA 发送字符串
void SCIa_TransmitString(unsigned char *string)
{
    int i;
    i = 0;
    while(string[i] != '\0')
    {
        SCIa_TransmitData(string[i]);
        i++;
    }
}

// 自定义printf函数
void SCIa_Printf(char *fmt,...)
{
    unsigned char UsartPrintfBuf[128];//最大长度1128
    va_list ap;
    unsigned char *pStr = UsartPrintfBuf;

    va_start(ap, fmt);
    vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap); //格式化
    va_end(ap);

    while(*pStr != 0 )
    {
      SCIa_TransmitData(*pStr++);  //逐个字节发送

      //等待 发射器缓冲区和移位寄存器均为空
      while(SciaRegs.SCICTL2.bit.TXEMPTY == 0)
      {
          // 超时逻辑
      }

      // 检查传输错误
      if (SciaRegs.SCIRXST.bit.FE || SciaRegs.SCIRXST.bit.OE || SciaRegs.SCIRXST.bit.PE)
      {
          // 处理错误
          SciaRegs.SCIRXST.bit.RXERROR = 0;      // 清除错误标志
      }
    }
}

主函数调用示例:

这里展示了函数在主函数的调用情况:

DEVICE_DELAY_US(500000);  的延时逻辑是冗余的

https://i-blog.csdnimg.cn/direct/c19e032bd27548aaa872cd649a89fcd6.png

实例程序中用的发送主要是 SCIa_Printf 函数的,因为它用起来最方便,有关其余发送函数的调用示例在主函数下面的注释中也有提到:

https://i-blog.csdnimg.cn/direct/17d84607e964466092749aa77c0585d5.png

测试效果图:

能够成功的一个一个回传发来的字符并计数:

https://i-blog.csdnimg.cn/direct/dcf4aedab3344b6ba6bc75a32dc7fc3f.png

https://i-blog.csdnimg.cn/direct/bd67671193f14ff7ab947c736a813cdf.png

完整工程下载:

https://i-blog.csdnimg.cn/direct/cb7d86ccbeff409a96e4b409100bcdca.png