当前位置: 首页 > article >正文

TMS320F28P550SJ9学习笔记6:SCI所有寄存器__结构体寄存器方式配置 SCI通信初始化__库函数发送测试

继续学习如何使用结构体寄存器的方式配置这款单片机的外设,这里配置SCI通信的初始化

但SCI gpio 的初始化还是调用的库函数比较方便,它的发送部分页调用了库函数

有关收发方面的逻辑,我会在之后重新自己写一次

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

目录

系统时钟频率:

SCI通信 SCICCR寄存器的配置:

SCI通信 SCICTL1寄存器的配置:

SCI通信 SCICTL2寄存器的配置:

SCI通信 SCIFFCT寄存器的配置:

SCI通信 SCIFFRX寄存器的配置:

 SCI通信 SCIFFTX寄存器的配置:

 SCIHBAUD 和 SCILBAUD 配置:

SCI通信 SCIPRI寄存器的配置:

SCI通信 SCIRXBUF 寄存器的配置:

SCI通信 SCIRXEMU寄存器的配置:

 SCI通信 SCIRXST 寄存器的配置:

  SCI通信 SCITXBUF寄存器的配置:

SCI 初始化 配置总览:

主函数应用:

测试结果图:

完整工程下载:


系统时钟频率:

 SYSCLK 是 150Mhz

@LSPCLK = 37.5 MHz (150 MHz SYSCLK)

SYSCLK可以在device.h文件查阅到

SCI通信 SCICCR寄存器的配置:

手册第2842页:

这里直接通过我的配置以及注释来查看应用:

   // SciaRegs、ScibRegs、ScicRegs 分别配置三组SCI通信端口

   SciaRegs.SCICCR.bit.ADDRIDLE_MODE=1; // 多处理器协议模式  0:空闲模式 1:地址位模式
   SciaRegs.SCICCR.bit.LOOPBKENA=0;     // 禁用环路回测模式(自己的TX 连接 自己的RX)
   SciaRegs.SCICCR.bit.PARITY=1;        // 奇偶校验 0:odd  1:Even ( 如果有的话 )
   SciaRegs.SCICCR.bit.PARITYENA=0;     // 禁用奇偶校验
   SciaRegs.SCICCR.bit.SCICHAR= 7 ;    // 字符长度:8
   SciaRegs.SCICCR.bit.STOPBITS=0;      // 0:1位停止位   1:2位停止位
   //SciaRegs.SCICCR.bit.rsvd1


 

SCI通信 SCICTL1寄存器的配置:

手册2844页:

   SciaRegs.SCICTL1.bit.RXERRINTENA=1;  // 使能接收错误中断
   //SciaRegs.SCICTL1.bit.SWRESET=0;      // 0:复位重置SCI通信  1:复位之后的启用 (复位不影响之前对其 波特率寄存器 之类的设定)
   SciaRegs.SCICTL1.bit.SLEEP=0;        // 监听睡眠标志,多处理器配置,被设置1时,接收器仍工作但不更新接收缓冲区就绪位,即使接收到地址位,也需要手动置0
   SciaRegs.SCICTL1.bit.TXENA=1;        // 1:启用传输器 0:禁用传输器
   //SciaRegs.SCICTL1.bit.TXWAKE          // 控制数据发送功能  (一般不需要手动设定)
   SciaRegs.SCICTL1.bit.RXENA=1;        //接收使能: 0:防止接收到的字符传输到SCIRXEMU和SCIRXBUF接收器缓冲区 1:将接收到的字符发送到SCIRXEMU和SCIRXBUF
   // RXENA 位能够禁用SCI接收器,停止接收数据,但不会阻止 RXERRINTENA 位控制的中断

SCI通信 SCICTL2寄存器的配置:

手册第2847页:

   SciaRegs.SCICTL2.bit.RXBKINTENA=1;   // 1:启用接收器缓冲区/中断  0:禁用 控制由RXRDY标志或BRKDT标志(SCIRXST.6和.5位)引起的中断请求
   //SciaRegs.SCICTL2.bit.TXRDY          //[只读] 当该位被设置时,表示发送数据缓冲区寄存器SCITXBUF已准备好接收下一个字符。将数据写入SCITXBUF会自动清除该位。  
   //SciaRegs.SCICTL2.bit.TXEMPTY        //[只读] 值为0h时,表示发射器缓冲区或移位寄存器或两者都载有数据;值为1h时,表示发射器缓冲区和移位寄存器均为空
   SciaRegs.SCICTL2.bit.TXINTENA=1;      // 1:启用TXRDY中断  0:禁用TXRDY中断  (传输完成的中断)

SCI通信 SCIFFCT寄存器的配置:

手册2860页:

   //SciaRegs.SCIFFCT.bit.ABD            // [只读] O:自动波特率检测未完成。'A'或'a'字符未成功接收  1h:自动波特率硬件在SCI接收寄存器中检测到'A'或'a'字符。自动检测完成
   //SciaRegs.SCIFFCT.bit.ABDCLR=1;      // 写入1可以清除位于15的ABD标志   写入0对ABD标志位无效,读取时会返回0
   SciaRegs.SCIFFCT.bit.CDC=0;           // 值为0时,禁用自动波特率对齐  值为1时,启用
   SciaRegs.SCIFFCT.bit.FFTXDLY=10;      // 定义从FIFO发送缓冲区到发送移位寄存器之间的传输延迟 最小延迟为0个波特率时钟周期,最大延迟为256个波特率时钟周期

SCI通信 SCIFFRX寄存器的配置:

手册2858页:

   SciaRegs.SCIFFRX.bit.RXFFIENA=1;      // 1:启用 RX FIFO接收中断 0:禁用
   SciaRegs.SCIFFRX.bit.RXFFIL=5;        // 接收FIFO中断级别位 可以设定的值范围是从0到31
   SciaRegs.SCIFFRX.bit.RXFFINTCLR=0;    // 1:清除接收FIFO中断 , 0: 对RXFIFINT标志位没有作用
   //SciaRegs.SCIFFRX.bit.RXFFOVF          // [只读] 0:接收FIFO没有溢出 1:表示接收FIFO溢出 表示FIFO中接收的单词超过16个,且第一个接收到的单词丢失
   SciaRegs.SCIFFRX.bit.RXFFOVRCLR=0;    // 0:对RXFFOVF标志位无效 1:清除RXFFOVF标志位
   SciaRegs.SCIFFRX.bit.RXFFST=10;       // 接收FIFO有16个字
   //SciaRegs.SCIFFRX.bit.RXFIFORESET      // 0:将FIFO指针写0以重置为零,并保持重置状态   1:重新启用接收FIFO操作
   //SciaRegs.SCIFFRX.bit.RXFFINT          // [只读] 0:表示RXFIFO中断尚未发生   1:表示RXFIFO中断已经发生

 SCI通信 SCIFFTX寄存器的配置:

 手册2856页:

   
   SciaRegs.SCIFFTX.bit.SCIFFENA=1;       // 1:启用SCI FIFO增强功能   0:禁用
   //SciaRegs.SCIFFTX.bit.SCIRST=0;       // 写0操作将引起软件复位,并复位TXFFINT和RXFFINT,从而清除TX/RX FIFO的内容。SCI将保持复位状态,直到写入1。
   SciaRegs.SCIFFTX.bit.TXFFIENA=1;
   SciaRegs.SCIFFTX.bit.TXFFIL=5;         // 发送FIFO中断级别位 
   //SciaRegs.SCIFFTX.bit.TXFFINT          // [只读]  0:TXFIFO中断未发生  1:TXFIFO中断发生
   //SciaRegs.SCIFFTX.bit.TXFFINTCLR=0;    // 0:对TXFIFINT标志位无效 1:清除位于第7位的TXFFINT标志
   SciaRegs.SCIFFTX.bit.TXFFST=10;       //发送FIFO有16个字
   //SciaRegs.SCIFFTX.bit.TXFIFORESET      //  0:将FIFO指针写0以重置为零,并保持重置状态   1:重新启用发送FIFO操作

 SCIHBAUD 和 SCILBAUD 配置:

2846页:

2847页:

   unsigned char scihbaud = 0;
   unsigned char scilbaud = 0;
   Uint32 scibaud = 0;
   scibaud = lspclk / (8 * baund) - 1;
   scihbaud = scibaud >> 8;
   scilbaud = scibaud & 0xFF;
   SciaRegs.SCIHBAUD.all=scihbaud;
   SciaRegs.SCILBAUD.all=scilbaud;

SCI通信 SCIPRI寄存器的配置:

手册2862页:

   
   // 决定了当仿真暂停时(例如,调试器命中断点)会发生什么。
   //外设可以继续它正在做的任何事情(自由运行模式),或者如果处于停止模式,
   //它可以立即停止,也可以在当前操作(当前接收/传输序列)完成后停止。
   SciaRegs.SCIPRI.bit.FREESOFT = 1;        // 0:立即停止暂停  1:在停止之前完成当前的接收/传输序列  2或3: 自由运行
   

SCI通信 SCIRXBUF 寄存器的配置:

手册2854页:

   //SciaRegs.SCIRXBUF.bit.SAR                // [只读] 接收字符位
   //SciaRegs.SCIRXBUF.bit.SCIFFFE            // [只读]  SCI FIFO帧错误标志位  0:表示在接收字符时没有发生帧错误(位7-0)  1:接收字符时发生了帧错误(位7-0)
   //SciaRegs.SCIRXBUF.bit.SCIFFPE            // [只读]  0:接收字符时没有发生奇偶校验错误 1:接收字符时发生了奇偶校验错误

SCI通信 SCIRXEMU寄存器的配置:

手册2852页:

   //SciaRegs.SCIRXEMU.bit.ERXDT              // [只读]  接收仿真缓冲数据

 

 SCI通信 SCIRXST 寄存器的配置:

 手册2850页:

   //SciaRegs.SCIRXST.bit.BRKDT               // [只读]  中断条件发生时会被设置 0:无中断发生 1:中断发生
   //SciaRegs.SCIRXST.bit.FE                  // [只读]  SCI会在没有找到预期的停止位时设置这个位 0:没有检测到帧错误 1:检测到帧错误
   //SciaRegs.SCIRXST.bit.OE                  // [只读]  0:未检测到overrun错误  1:检测到overrun错误
   //SciaRegs.SCIRXST.bit.PE                  // [只读]  0: 无奇偶校验错误/奇偶校验被禁用  1:奇偶校验错误
   //SciaRegs.SCIRXST.bit.RXERROR             // [只读]  0: 无错误标志设置   1:错误标志设置 该错误标志不能直接清除,只能主动的软件复位、通道复位(SCIRST)或系统复位来清除。
   //SciaRegs.SCIRXST.bit.RXRDY               // [只读]  0: SCI RXBUF中没有新字符   1:字符准备好从SCI RXBUF读取
   //SciaRegs.SCIRXST.bit.RXWAKE              // [只读]  多处理器模式下的 接收器唤醒检测标志 0: 未检测到接收器唤醒条件   1:检测到接收器唤醒条件

  SCI通信 SCITXBUF寄存器的配置:

 手册 2856页:

    //SciaRegs.SCITXBUF.bit.TXDT               // 传输数据缓冲区 可以读写

 

SCI 初始化 配置总览:

前面的配置有些会有点问题,但注释基本都对的,这里直接贴出我配好的SCI初始化函数:

然后它的引脚初始化方面我还是使用了库函数的形式初始化,简短一些


//初始化SCI 通信
void Init_SCIA(uint32_t baund,uint32_t lspclk)
{
   // SciaRegs、ScibRegs、ScicRegs 分别配置三组SCI通信端口

   //SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 1; // 多处理器协议模式  0:空闲模式 1:地址位模式
   SciaRegs.SCICCR.bit.LOOPBKENA = 0;     // 禁用环路回测模式(自己的TX 连接 自己的RX)
   SciaRegs.SCICCR.bit.PARITY = 1;        // 奇偶校验 0:odd  1:Even ( 如果有的话 )
   SciaRegs.SCICCR.bit.PARITYENA = 0;     // 禁用奇偶校验
   SciaRegs.SCICCR.bit.SCICHAR = 7 ;    // 字符长度:8
   SciaRegs.SCICCR.bit.STOPBITS = 0;      // 0:1位停止位   1:2位停止位
   //SciaRegs.SCICCR.bit.rsvd1

   SciaRegs.SCICTL1.bit.RXERRINTENA = 1;  // 使能接收错误中断
   SciaRegs.SCICTL1.bit.SWRESET = 1;      // 0:复位重置SCI通信  1:复位之后的启用 (复位不影响之前对其 波特率寄存器 之类的设定)
   //SciaRegs.SCICTL1.bit.SLEEP = 0;        // 监听睡眠标志,多处理器配置,被设置1时,接收器仍工作但不更新接收缓冲区就绪位,即使接收到地址位,也需要手动置0
   SciaRegs.SCICTL1.bit.TXENA = 1;        // 1:启用传输器 0:禁用传输器
   //SciaRegs.SCICTL1.bit.TXWAKE          // 控制数据发送功能  (一般不需要手动设定)
   SciaRegs.SCICTL1.bit.RXENA = 1;        // 接收使能: 0:防止接收到的字符传输到SCIRXEMU和SCIRXBUF接收器缓冲区 1:将接收到的字符发送到SCIRXEMU和SCIRXBUF
   // RXENA 位能够禁用SCI接收器,停止接收数据,但不会阻止 RXERRINTENA 位控制的中断

   SciaRegs.SCICTL2.bit.RXBKINTENA = 1;   // 1:启用接收器缓冲区/中断  0:禁用 控制由RXRDY标志或BRKDT标志(SCIRXST.6和.5位)引起的中断请求
   //SciaRegs.SCICTL2.bit.TXRDY          // [只读] 当该位被设置时,表示发送数据缓冲区寄存器SCITXBUF已准备好接收下一个字符。将数据写入SCITXBUF会自动清除该位。
   //SciaRegs.SCICTL2.bit.TXEMPTY        // [只读] 值为0h时,表示发射器缓冲区或移位寄存器或两者都载有数据;值为1h时,表示发射器缓冲区和移位寄存器均为空
   SciaRegs.SCICTL2.bit.TXINTENA = 1;      // 1:启用TXRDY中断  0:禁用TXRDY中断  (传输完成的中断)

   //SciaRegs.SCIFFCT.bit.ABD                // [只读] O:自动波特率检测未完成。'A'或'a'字符未成功接收  1h:自动波特率硬件在SCI接收寄存器中检测到'A'或'a'字符。自动检测完成
   //SciaRegs.SCIFFCT.bit.ABDCLR = 1;        // 写入1可以清除位于15的ABD标志   写入0对ABD标志位无效,读取时会返回0
   SciaRegs.SCIFFCT.bit.CDC = 0;           // 值为0时,禁用自动波特率对齐  值为1时,启用
   SciaRegs.SCIFFCT.bit.FFTXDLY = 10;      // 定义从FIFO发送缓冲区到发送移位寄存器之间的传输延迟 最小延迟为0个波特率时钟周期,最大延迟为256个波特率时钟周期

   SciaRegs.SCIFFRX.bit.RXFFIENA = 1;      // 1:启用 RX FIFO接收中断 0:禁用
   SciaRegs.SCIFFRX.bit.RXFFIL = 5;        // 接收FIFO中断级别位 可以设定的值范围是从0到31
   SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;    // 1:清除接收FIFO中断 , 0: 对RXFIFINT标志位没有作用
   //SciaRegs.SCIFFRX.bit.RXFFOVF          // [只读] 0:接收FIFO没有溢出 1:表示接收FIFO溢出 表示FIFO中接收的单词超过16个,且第一个接收到的单词丢失
   SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;    // 0:对RXFFOVF标志位无效 1:清除RXFFOVF标志位
   //SciaRegs.SCIFFRX.bit.RXFFST = 10;       // 接收FIFO有16个字
   SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;   // 0:将FIFO指针写0以重置为零,并保持重置状态   1:重新启用接收FIFO操作
   //SciaRegs.SCIFFRX.bit.RXFFINT          // [只读] 0:表示RXFIFO中断尚未发生   1:表示RXFIFO中断已经发生

   SciaRegs.SCIFFTX.bit.SCIFFENA = 1;      // 1:启用SCI FIFO增强功能   0:禁用
   SciaRegs.SCIFFTX.bit.SCIRST = 1;        // 写0操作将引起软件复位,并复位TXFFINT和RXFFINT,从而清除TX/RX FIFO的内容。SCI将保持复位状态,直到写入1。
   SciaRegs.SCIFFTX.bit.TXFFIENA = 1;
   SciaRegs.SCIFFTX.bit.TXFFIL = 5;        // 发送FIFO中断级别位
   //SciaRegs.SCIFFTX.bit.TXFFINT          // [只读]  0:TXFIFO中断未发生  1:TXFIFO中断发生
   SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;    // 0:对TXFIFINT标志位无效 1:清除位于第7位的TXFFINT标志
   //SciaRegs.SCIFFTX.bit.TXFFST = 10;       //发送FIFO有16个字
   SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;   //  0:将FIFO指针写0以重置为零,并保持重置状态   1:重新启用发送FIFO操作


   unsigned char scihbaud = 0;
   unsigned char scilbaud = 0;
   Uint32 scibaud = 0;
   scibaud = lspclk / (8 * baund) - 1;
   scihbaud = scibaud >> 8;
   scilbaud = scibaud & 0xFF;
   SciaRegs.SCIHBAUD.all=scihbaud;
   SciaRegs.SCILBAUD.all=scilbaud;

   // 决定了当仿真暂停时(例如,调试器命中断点)会发生什么。
   //外设可以继续它正在做的任何事情(自由运行模式),或者如果处于停止模式,
   //它可以立即停止,也可以在当前操作(当前接收/传输序列)完成后停止。
   SciaRegs.SCIPRI.bit.FREESOFT = 1;        // 0:立即停止暂停  1:在停止之前完成当前的接收/传输序列  2或3: 自由运行

   //SciaRegs.SCIRXBUF.bit.SAR                // [只读] 接收字符位
   //SciaRegs.SCIRXBUF.bit.SCIFFFE            // [只读]  SCI FIFO帧错误标志位  0:表示在接收字符时没有发生帧错误(位7-0)  1:接收字符时发生了帧错误(位7-0)
   //SciaRegs.SCIRXBUF.bit.SCIFFPE            // [只读]  0:接收字符时没有发生奇偶校验错误 1:接收字符时发生了奇偶校验错误

   //SciaRegs.SCIRXEMU.bit.ERXDT              // [只读]  接收仿真缓冲数据

   //SciaRegs.SCIRXST.bit.BRKDT               // [只读]  中断条件发生时会被设置 0:无中断发生 1:中断发生
   //SciaRegs.SCIRXST.bit.FE                  // [只读]  SCI会在没有找到预期的停止位时设置这个位 0:没有检测到帧错误 1:检测到帧错误
   //SciaRegs.SCIRXST.bit.OE                  // [只读]  0:未检测到overrun错误  1:检测到overrun错误
   //SciaRegs.SCIRXST.bit.PE                  // [只读]  0: 无奇偶校验错误/奇偶校验被禁用  1:奇偶校验错误
   //SciaRegs.SCIRXST.bit.RXERROR             // [只读]  0: 无错误标志设置   1:错误标志设置 该错误标志不能直接清除,只能主动的软件复位、通道复位(SCIRST)或系统复位来清除。
   //SciaRegs.SCIRXST.bit.RXRDY               // [只读]  0: SCI RXBUF中没有新字符   1:字符准备好从SCI RXBUF读取
   //SciaRegs.SCIRXST.bit.RXWAKE              // [只读]  多处理器模式下的 接收器唤醒检测标志 0: 未检测到接收器唤醒条件   1:检测到接收器唤醒条件

   //SciaRegs.SCITXBUF.bit.TXDT               // 传输数据缓冲区 可以读写


   //初始化SCI引脚
   GPIO_SetupPinMux(28, GPIO_MUX_CPU1, 1);
   GPIO_SetupPinOptions(28, GPIO_INPUT, GPIO_PUSHPULL);
   GPIO_SetupPinMux(29, GPIO_MUX_CPU1, 1);
   GPIO_SetupPinOptions(29, GPIO_OUTPUT, GPIO_ASYNC);
}

主函数应用:

主要看俩部分内容:一个是怎么调用初始化的,还有一个是调用库函数发送

但这个官方例程的库函数发送有些问题,并不好用,

我会在之后的文章自己重写一个相关函数

测试结果图:

完整工程下载:

https://download.csdn.net/download/qq_64257614/90463861

 


http://www.kler.cn/a/575994.html

相关文章:

  • 04.基于C++实现多线程TCP服务器与客户端通信
  • GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题
  • MySQL 数据库优化与定期数据处理策略
  • 卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现
  • 【2025年后端开发终极指南:云原生、AI融合与性能优化实战】
  • Linux学习笔记(以Ubuntu为例)
  • 洛谷B2074 计算星期几
  • 批量多线程下载ERA5数据
  • Qt的QGroupBox的使用方法
  • 【数据挖掘]Ndarray数组的创建
  • 研究案例:英伟达研究中心,华盛顿大学——TacSL:使用Franka机器人的视觉触觉传感器模拟和学习库
  • 从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践
  • HTTP 与 HTTPS 协议:从基础到安全强化
  • 豆包回答AI生成sql的应用实现思路
  • 架构师论文《论静态测试在软件开发中的应用和分析》
  • 处理VFS对象以及标准函数(生动理解文件系统)
  • SpringBoot生成唯一ID的方式
  • NLP轻松入门—RNN
  • Spring Boot 3.x 核心注解详解与最佳实践
  • stm32 基于蓝桥物联网赛 oled屏使用