本文将介绍在mm32f013x上实现uart单线半双工的功能应用。
uart单线半双工简介
在使用数字舵机通讯时所用到的通信方式为uart通信,但舵机只有三根接线,除去vcc和gnd,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式。在单线半双工模式下,tx 和 rx 引脚在芯片内部互连。
01 配置流程
单线半双工模式是通过设置uart_scr寄存器的hdsel位,在这个模式里uart_scr 寄存器的scen位必须保持清零状态。
在单线半双工模式下,tx和rx引脚在芯片内部互联,使用控制位”half duplex sel”(uart_scr 中的 hdsel 位) 选择半双工和全双工通信。
注意
当选择单线半双工模式时rx 不再被使用,当有数据需要发送的时候io才会被uart驱动,没有数据传输时tx总是被释放,所以使用单线半双工需要外部加上拉。
除此之外通讯上和正常的uart模式类似。由于是单线半双工同一时刻总线上只能有一个节点发送,所以需要软件协议层去管理线上冲突防止多个设备同时发送,当 txen 位被设置时,只要数据一写到数据寄存器上,发送就继续。
02 uart_scr寄存器描述
配置uart_scr 的hdsel为1
uart_scr 寄存器的scen位清零
初始化uart1
从官网上下载mm32f013x例程,里面有uart普通模式的配置,在这个基础上我们直接调用uart_halfduplexcmd(uart1,enable);函数接口将串口配置成单线半双工模式,然后io口初始化只需要配置pa9 tx即可,如下:
void uart1_nvic_init(u32 baudrate)
{
uart_inittypedef uart_initstructure;
nvic_inittypedef nvic_initstructure;
gpio_inittypedef gpio_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_uart1, enable);
rcc_ahbperiphclockcmd(rcc_ahbenr_gpioa, enable);
//uart1 nvic
nvic_initstructure.nvic_irqchannel = uart1_irqn;
nvic_initstructure.nvic_irqchannelpriority = 1;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
//baud rate
uart_structinit(&uart_initstructure);
uart_initstructure.baudrate = baudrate;
//the word length is in 8-bit data format.
uart_initstructure.wordlength = uart_wordlength_8b;
uart_initstructure.stopbits = uart_stopbits_1;
//no even check bit.
uart_initstructure.parity = uart_parity_no;
//no hardware data flow control.
uart_initstructure.hwflowcontrol = uart_hwflowcontrol_none;
uart_initstructure.mode = uart_mode_rx | uart_mode_tx;
uart_init(uart1, &uart_initstructure);
uart_halfduplexcmd(uart1,enable); //half duplex enable
uart_itconfig(uart1, uart_it_rxien, enable);
uart_cmd(uart1, enable);
gpio_pinafconfig(gpioa, gpio_pinsource9, gpio_af_1);
//uart1_tx gpioa.9
gpio_structinit(&gpio_initstructure);
gpio_initstructure.gpio_pin = gpio_pin_9;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_init(gpioa, &gpio_initstructure);
}
功能验证测试
uart单线半双工功能测试我们现在拿两个mm32f0133的板子一个做主机一个做从机进行单线收发测试,主机先发送一包数据给从节点,当从节点收到这包数据后再把这包数据发回给主机,然后主机和从机两个板子pa9短接到一起,外部在加一个4.7k上拉电阻。
主机函数处理:
uint8_t txbuff[10]= {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa};
s32 main(void)
{
console_init(115200);//uart2 printf打印
uart1_nvic_init(115200);
printf(“uart half duplex tx test /r/n”);
uart1_send_group(txbuff,sizeof(txbuff));
printf(“tx data: ”);
for(index=0;index
主机uart的中断服务函数里面,将接从机发送的数据存放在rx_buff里面,当收到一包数据后通过printf打印到串口,和原始发送的数据进行对比。
void uart1_irqhandler(void)
{
u8 recvbyte;
// send packet
if (uart_getitstatus(uart1, uart_it_txien) != reset)
{
uart_clearitpendingbit(uart1, uart_it_txien);
}
// recv packet
if (uart_getitstatus(uart1, uart_isr_rx) != reset)
{
uart_clearitpendingbit(uart1, uart_isr_rx);
recvbyte = uart_receivedata(uart1);
rx_buff[rx_cnt] = recvbyte;
rx_cnt++;
if(rx_cnt == 10)
{
guartrxsta = 1;
rx_cnt = 0;
}
}
}
从机函数处理:
s32 main(void)
{
console_init(115200);//uart2 printf打印
uart1_nvic_init(115200);
printf(“uart half duplex rx test/r/n”);
while(1)
{
if(guartrxsta == 1)//收到一包数据
{
guartrxsta = 0;
uart1_send_group(rx_buff,10);
memset(rx_buff,0x00,10);
}
}
//return 0;
}
从机uart的中断服务函数里面,将接主机发送的数据存放在rx_buff里面,当收到一包数据后通过单线半双工这个串口发送回去。
void uart1_irqhandler(void)
{
u8 recvbyte;
// send packet
if (uart_getitstatus(uart1, uart_it_txien) != reset)
{
uart_clearitpendingbit(uart1, uart_it_txien);
}
// recv packet
if (uart_getitstatus(uart1, uart_isr_rx) != reset)
{
uart_clearitpendingbit(uart1, uart_isr_rx);
recvbyte = uart_receivedata(uart1);
rx_buff[rx_cnt] = recvbyte;
rx_cnt++;
if(rx_cnt == 10)
{
guartrxsta = 1;
rx_cnt = 0;
}
}
}
观察测试结果:
然后我们通过主机uart2 的printf打印可以看到主机tx data 和从机返回的rx data数据是一样的。
再看看下图逻辑分析仪抓取的逻辑波形,可以也可以看到主机发送的波形和从机返回的波形数据是一样的。
转自:灵动微电子
三相双电源自投控制原理图
联想小新Pro 14 2021亮相,标配11.5英寸OLED屏和DCI-P3色域
为什么大部分操作系统都使用C语言来编写
研讨会预告 | 详解 NVIDIA 在 SIGGRAPH 2023 的发布 —— NVIDIA AI 解决方案赋能传媒娱乐行业
或颠覆光学测距技术!新型铌酸锂激光技术诞生
在MM32F013x上实现UART单线半双工的功能应用
印度产iPhone手机下月开卖,售价大幅下降
AMD锐龙93850X曝光 基础频率高达4.3GHz加速最高更是5.1GHz
盘点一下那些应用在足球比赛和训练中的“黑”科技
教你们怎么去设定寄存器的初始值
尼康野心搞VR相机,裁员亦在所不惜
微软新Edge浏览器准备就绪,Beta标识已移除
WIFI联盟撤销华为是怎么回事 华为受到美国诸多限制
5G彩电时代已经来临
移通创联Modbus转Profibus网关连接ABBACS530变频器配置案例
电动车接连起火,动力电池被推向风口浪尖
创意设计之LED摇摇棒
与新机相差400元,这款魅族魅蓝Note6仅售999元手机你会考虑吗?
智慧灯杆在智慧交通领域中有着怎样的运用
高清视频解码器功能介绍