2024年tmc2209 串口

tmc2209 串口TMS320F28335 的串口编程配置 参考 普中科技 DSP28335 开发攻略 和 TI 官方芯片手册 TMS320F2833x 2823x Serial Communicatio Interface SCI Reference Guide Rev A 一 介绍 串 行 通 信 接口 口 SCI 模 模块 块 SCI A SCI B

TMS320F28335的串口编程配置,参考 《普中科技DSP28335开发攻略》  和 TI官方芯片手册《TMS320F2833x, 2823x Serial Communications Interface (SCI) Reference Guide (Rev. A)》


一. 介绍

增强型特性:
• 自动波特率检测硬件逻辑电路
• 16 级发送/接收 FIFO


二. SCI 配置

2.1 寄存器

 

2.1.1 SCICCR - 通信控制寄存器

停止位、奇偶校验、数据长度等的配置

每一位含义:

 

2.1.2  SCICTL1 - 控制寄存器1

控制TX、RX的使能等

 

 

2.1.2  SCIHBAUD、SCILBAUD - 波特率设置寄存器

配置串口的波特率大小

根据手册可知:BRR = LSPCLK/(SCI 异步波特率*8)-1

 

2.1.4  SCICTL2 - 控制寄存器2

发送空标志位、接收和发送中断使能

 

各位含义如下:

 

2.1.5  SCIRXST- 接收状态寄存器

接收数据的错误标志位、就绪标志位、接收被间断、帧格式错误标志位

各位含义如下:

只要发生错误,bit0错误标志位就置1

 

2.1.6  SCIRXEMU、SCIRXBUF- 数据接收缓冲寄存器

Emulation Data Buffer (SCIRXEMU)、Receiver Data Buffer (SCIRXBUF)

接收到的数据从 RXSHF 传送到 SCIRXEMU 和 SCIRXBUF。传送完成以后 RXRDY (bit SCIRXST.6)置位,表明接收的数据已被读取。两个寄存器的数值完全一样,它们有各自独立的地址,但是共用一个物理存储空间。他们唯一的区别就是,读取 SCIRXEMU的数据不会清除 RXRDY 位,而读取 SCIRXBUF 会清除 RXRDY 位。因此一般读取 SCI接收的数据都是读取 SCIRXBUF 寄存器。SCIRXEMU 寄存器主要用于仿真时,因为它可以不清除 RXRDY 标志位而不断读取接收到的数据。在系统复位时 SCIRXEMU被清空。其各位功能描述如下:

 

2.1.7  SCITXBUF- 数据发送缓冲寄存器

需要发送的数据将被写入该寄存器,数据使用右对齐方式。要发送的数据从该寄存器中传送到 TXSHF 移位发送寄存器后 TXRDY  (SCICTL2.7)置位,表明该寄存器可以写入下一个需要发送的数据。若 TX INT ENA  (SCICTL2.0)置位,数据发送可以出发中断。

 

2.1.8  SCIFFTX-  发送 FIFO 寄存器

发送FIFO的使能配置、FIFO中断标志位、发送FIFO的深度设置

 

2.1.9  SCIFFRX-  接收 FIFO 寄存器

 

2.1.10  SCIFFCT -  FIFO 控制寄存器

使能波特率的自动检测()

在 F28335 处理器上,增强功能的 SCI 模块硬件支持自动波特率检测逻辑。寄存器 SCIFFCT 的 ABD 位和 CDC 位控制自动波特率逻辑,使能 SCIRST 位使自动波特率逻辑工作。增加自动波特率检测功能的 SCI 通信接口除了能够满足正常通信自动检测系统的通信速率外,还支持采用 SCI 接口上电引导装载程序,这对于通过上位机采用 SCI 接口实时更新系统软件非常重要。

当 CDD 为 1,如果 ABD 也置位1,表示自动波特率检测开始工作,就会产生 SCI发送 FIFO 中断(TXINT)。同时在中断服务程序中必须使用软件将 CDC 位清零,否则如果中断服务程序执行完 CDC 仍然为 1,后面就不会产生中断。具体的操作步骤如下:
①将 SCIFFCT 中的 CDC 位置位1,清除 ABD 位(位 15),使能 SCI 的自动波特率检测模式
②初始化波特率寄存器为 1 或限制在 500kbps 内。
③允许 SCI 以期望的波特率从一个主机接收字符“A”或字符“a”。如果第一个字符是 A 或者 a,则说明自动波特率检测已经检测到 SCI 通信的速率,然后将 ABD 位置 1。
④自动检测硬件将用检测到的波特率的十六进制值刷新波特率寄存器的值,这个刷新逻辑也会产生一个 CPU 中断。
⑤通过向 SCIFFCT 寄存器的 ABD CLR 位写入 1 清除 ABD 位,响应中断。写 0清除 CDC 位,禁止自动波特率逻辑。
⑥读到接收缓冲器的字符 A 或者 a 时,清空缓冲和缓冲状态位。
⑦当 CDC 为 1 时,如果 ABD 也置位表示自动波特率检测开始工作,就会产生SCI 发送 FIFO 中断(TXINT),同时在中断服务程序中必须使用软件将 CDC 位清0。

2.1.11  SCIPRI-   优先级控制寄存器

2.2 程序编程

2.2.1 串口的初始化

第一步. 使能 SCI 外设时钟及初始化对应 GPIO

第二步.SCI 工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等;FIFO使能、深度设置; 接收和发送中断使能配置

void UARTa_Init(Uint32 baud) { unsigned char scihbaud=0; unsigned char scilbaud=0; Uint16 scibaud=0; scibaud = /(8*baud)-1; scihbaud = scibaud>>8; scilbaud = scibaud&0xff; //第一步. 使能 SCI 外设时钟及初始化对应 GPIO ---------------- EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // 使能SCI-A时钟 EDIS; //SCI 的 GPIO 初始化配置,TI 已经在库文件内提供给我们了 //使用哪个 SCI 口可通过宏定义决定,该宏定义在 DSP2833x_Device.h 头文件内已定义了, //使用哪个就将宏值改为 1 即可 InitSciaGpio(); //------------------------------------------------------ //第二步.SCI 工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等。 //Initalize the SCI FIFO SciaRegs.SCIFFTX.all=0xE040;// FIFO功能使能、重新使能发送FIFO、清除TXFFINT标志位 SciaRegs.SCIFFRX.all=0x204f;//重新使能接收FIFO、清除RXFFINT标志位、接收FIFO深度设置为16 SciaRegs.SCIFFCT.all=0x0;//波特率非自动检测 // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断 SciaRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY、BRKDT中断 SciaRegs.SCIHBAUD = scihbaud ; SciaRegs.SCILBAUD = scilbaud ; //SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset,发送使能、接收使能 }

波特率具体配置计算问题:

1. 来源

SCI时钟来至于:

2. SYSCLKOUT的大小

笔者开发板外部晶振使用的为30MHz

根据时钟树 其中:PLLCR.bit.DIV = 0x1010

     

PLLSTS.bit.DIVSEL = 2

所以:SYSCLKOUT = 30M * 10 /2 = 150Mhz

 

3. 计算SCI时钟

时钟配置函数里面LOSPCP配置:

所以 SCI时钟为150M /4 = 37.5MHz

2.2.2 串口数据发送函数

单数据发送

// Transmit a character from the SCI' void UARTa_SendByte(int a) { while (SciaRegs.SCIFFTX.bit.TXFFST != 0); SciaRegs.SCITXBUF=a; }

字符串发送

void UARTa_SendString(char * msg) { int i=0; while(msg[i] != '\0') { UARTa_SendByte(msg[i]); i++; } }

2.2.3 串口数据接收函数

2.2.3.1 采用查询方式接收

// Wait for inc character while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1 for empty state // Get character ReceivedChar = SciaRegs.SCIRXBUF.all;

2.2.3.2 采用中断方式接收

 

 

 

 

 

 

知秋君
上一篇 2024-11-07 22:02
下一篇 2024-11-12 14:48

相关推荐