作者: ti 北方区工程师 young hu 和 jingyuan zhao
引言:
c2000 piccolo系列mcu芯片内部一般都集成了1-2个硬件sci (uart) 。有时出于成本或者layout面积的考虑,只能选择小封装或资源较少的型号,那么就会出现硬件sci不够用的情况。这时便可使用gpio软件模拟成sci接口。
本文给出了使用外部中断和cpu定时器将gpio模拟成sci接口的方法和例程。
一、测试相关环境
测试相关的软硬件环境如下表所示:
ccs version6.2.0.00050
compiler versionti v15.12.3.lts
controlsuitev3.4.9
测试芯片型号tms320f28069m
硬件环境launchxl-f28069m
gpio引脚使用tx: gpio33 rx: gpio0
硬件资源使用cpu_timer0, xint3
您可以选择任意示例工程,这里选择的工程为timed_led_blink,它的工程文件的目录为:
c:\ti\controlsuite\device_support\f2806x\v151\f2806x_examples_ccsv5\timed_led_blink
在ccs中import该工程后,将example_2806xledblink.c替换为本文提供的源码即可。
二、 功能描述
sci (serial communications interface, 串行通信接口) 是一种双线异步串行接口,通常也被称为uart。sci提供了与一些常用外设的通信接口。sci的数据帧格式,如图1所示,通常由以下部分组成:
1 bit 起始位:一位逻辑0,表示传输开始。
1-8 bit 数据位:小端传输,先传输低位再传输高位。
1 bit奇偶校验位(可选):加上这一位后使数据位1的个数为奇数或者偶数。
1或2 bit停止位:一位或两位逻辑1,表示传输结束。
图1 sci数据帧格式
1. 发送程序框图和发送状态机
发送使能后,cpu定时器打开,每隔8.67us(115200 bps)产生一次中断,在定时器中断发生时改变引脚的输出电平实现数据发送。第一个定时器中断时,发送引脚电平置低,标志数据发送开始。之后以小端模式从低位到高位依次发送数据位、校验位。采用奇校验时,数据按位异或的结果和校验位的异或结果应为1;采用偶校验时,数据按位异或的结果和校验位的异或结果应为0。传输结束后,发送引脚输出一位高电平,标志发送结束。
2. 接收程序框图和接收状态机
接收使能后,开启外部中断。sci接收引脚在空闲状态下处于高电平,接收数据的起始位为低电平。由于数据到来时间的不确定,故采用外部中断下降沿触发的方式检测数据传输的起始位。外部中断检测到下降沿后,标志数据传输开始。此时先延时4us,等待信号电平稳定,然后关闭外部中断,打开定时器。与发送相同,定时器每8.67us产生一次中断。每次中断产生时,对接收引脚的电平进行采样,依次接收数据位、校验位和停止位。当所有数据接收完成后,关闭定时器,等待接收下次使能。
3. 功能描述
波特率: 115200 bps (可调), 停止位:1 bit,数据位:1-8 bit,校验位:无校验、奇校验或偶校验。可根据实际需求在宏定义中修改recvbufflen确定接收缓冲区大小:
#define recvbufflen 800
以接收缓冲区大小为800 bytes为例,每当程序从gpio0接收满800 bytes数据后,就会把全部接收到的数据通过gpio32发出。
三、api
1. 宏定义
#define parity 1 // 0: no parity, 1: odd, 2: even
#define datalength 8 // data bit length 1 - 8
#define recvbufflen 25 // receive buffer size
parity:校验位。可设置为0:无校验,1:奇校验,2:偶校验。
datalength:数据位长度,可配置为1-8比特。
recvbufflen:接收缓冲区大小,通常可设置为数据包长度。
2. 全局变量
// software sci mode
// 0: rx 1: tx
uint16 swscimode = 0;
// rx data & state
uint16 rxdata = 0;
uint16 rxstate = 0;
uint16 rxerror = 0;
// tx data & state
uint16 txdata = 0;
uint16 txstate = 0;
swscimode:定义软件串口模式。为节省硬件资源,采用半双工模式。0为接收模式,1为发送模式。
rxdata:从gpio接收到的单字节数据。
rxstate:接收程序状态机状态,0-3为有效状态,详见图3。
rxerror:接收错误指示标志,在调用接收相关api后值会相应改变,需手动清零。具体定义如下:
0x000x010x020x03
接收正常校验错误未检测到停止位停止位+校验位错误
txdata:从gpio发送到的单字节数据。
txstate:发送程序状态机状态,0-5为有效状态,详见图2。
3. 函数
// software sci related functions
uint16 sw_sci_recv_byte(void);
void sw_sci_recv_bytes(uint16* databuff, uint16 len);
void sw_sci_send_byte(uint16 data);
void sw_sci_send_bytes(uint16* databuff, uint16 len);
void sw_sci_send_string(char* txstring);
函数名称功能描述
uint16 sw_sci_recv_byte(void)返回gpio0接收到的单字节数据。
void sw_sci_recv_bytes(uint16*databuff, uint16 len)从gpio0接收len个字节数据存入缓冲区databuff中。
void sw_sci_send_byte(uint16 data);使用gpio33发送单字节数据。
void sw_sci_send_bytes(uint16* databuff, uint16 len)使用gpio33发送databuff中len个连续字节数据。
void sw_sci_send_string(char* txstring);使用gpio33发送字符串txstring。txstring必须以\0结尾,方便用户调试使用。
四、测试
1. 波特率及cpu负载测试
为测试软件sci的性能,本例程额外使用了gpio32作为测试引脚用于指示程序状态。当程序进入软件sci定时器中断时,gpio32输出高电平;其余时间gpio32输出低电平。图4为8位数据位、1位奇校验、1位停止位、115200波特率下,发送0x55时tx引脚(蓝线)和测试引脚(黄线)的波形。从图中可以看出,实际发送波特率为116280bps,误差0.9%。测试引脚的高电平持续时间和,即为软件sci发送单字节数据占用cpu的时间。经过测量,测试引脚高电平共持续10.32us,单字节理论发送时间为95.49us,故发送时cpu负载为10.8%。
图4软件串口例程发送测试
图5为8位数据位、1位奇校验、1位停止位、115200波特率下,接收0x55时rx引脚(蓝线)和测试引脚(黄线)的波形。经过测量,测试引脚高电平共持续7.2us,单字节理论接收时间为95.49us,故接收时cpu负载为7.5%。
图5软件串口例程接收测试
在没有示波器的情况下也可使用c2000 mcu内部的ecap测量实际发送波特率和cpu负载。
2. 数据收发测试
软件串口例程配置为115200波特率、8bit数据位、1停止位、奇校验,pc端串口助手采用相同配置时,数据可以正常收发:
将串口助手软件改为偶校验,例程提示校验位错误:
软件串口例程配置为无校验位,串口助手采用奇校验时,例程实际在接收结束位时接收到的是校验位,此时例程提示结束位错误:
例程和串口助手采用相同配置时,以5hz频率发送800 bytes数据包,收发正常:
五、注意事项
1. 改变通信波特率可通过调整cpu定时器的分频系数实现。
理论分频系数 =
以launchxl-f28069m 为例,launchxl-f28069m主频为90 mhz。理论分频系数应为:
实际使用时由于系统时钟会有误差,推荐使用示波器测量实际输出波特率对分频系数进行调整。
2. tx引脚可根据需求更改至任意引脚。rx引脚需要通过外部中断下降沿判断数据起始位,所以只能在gpio0-gpio31中进行选择。
3. 为节省硬件资源,接收和发送程序使用同一cpu定时器,所以仅能进行半双工通信。若想实现全双工通信可再多使用一个定时器将发送和接收分开。
六、待办事项
1. 增加使用ecap测量波特率和cpu负载功能。
2. 增加波特率自动校正功能。
ROHM新推0603尺寸(1608mm)高亮度芯片LED“SML-D15系列”
苹果红色iPhone7/7Plus上市,中国网友为何不再炸?
东宸建荣机电五金:以精密减速机,助力工业智能化
思必驰全场景会议数智化解决方案,助力用户打造高效会议体验
基于PC的机器人控制解决方案
使用外部中断和CPU定时器将GPIO模拟成SCI接口的方法和例程
小米回应停牌不予置评
自动驾驶的泡沫破了么?自动驾驶人正在经历什么呢?
庄稼喷农药无人机也做得到了?利用大数据规划航线 区域记忆喷洒
乐视不是卖薯片的 新品黑科技一搏眼球
Kicad原理图设置方法
地质勘探项目中关于EthernetIP以太网和CAN总线的通讯
无刷电机的特性是什么
台积电,重新定义晶圆代工
步进电机驱动器的分类及模块
大龄程序员的出路在哪
Tcl的注释与续行
货物搬运车的发展趋势和充电解决方案
智能有机肥检测仪第六代的优势是什么
电网和电力系统的区别