0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Demo介绍UART 9bit通信的同步帧方式

电子设计 ? 来源:电子设计 ? 作者:电子设计 ? 2022-02-18 16:05 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在之前的微课堂中和大家分享过灵动MM32系列MCUUART通信实例,在此实例的基础上我们增加UART 9bit通信功能。UART 9bit通信的作用是第9bit用于标识是地址或数据,第9bit 为1标识是从机地址,为0标识是数据,此外UART通信的第9bit也可作为数据的同步帧位使用。

在双机通讯中,UART的8bit通信的第九位一般是奇偶校验位,而多机通讯中,第九位用于标识地址或数据,常用1表示后面的是从机地址,0表示后面的是数据。我们通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的UART服务开销。未被寻址的设备可启用其静默功能置于静默模式。在静默模式里,任何接收状态位都不会被设置,所有接收中断被禁止。

以MM32F013x系列MCU的UART通信为例,通过一个示例Demo介绍UART 9bit通信的同步帧方式。

一、与UART 9bit通信相关的寄存器

pIYBAGAH2oKAGZoYAAE7VxWBs8w690.png

图1

如上图1所示为UART通用控制寄存器UART_CCR,在MM32F013x UM手册的第489和第490页有关于该寄存器位的详细描述。本实例用到的UART通用控制寄存器UART_CCR位说明如下:

Bit11

B8EN(rw, reset:0x00)UART同步帧发送第9bit使能控制位。该位使能后校验使能PEN不起作用。

1:使能同步帧第9bit发送。

库函数设置:

UART_Enable9bit(UART1, ENABLE)

0:禁止同步帧第9bit发送。

库函数设置:

UART_Enable9bit(UART1, DISABLE)

Bit10

B8TOG(rw,reset:0x00)UART同步帧发送第9bit自动翻转控制位。

1:使能第9bit自动翻转。

库函数设置:

UART_Set9bitAutomaticToggle(UART1, ENABLE)

0:禁止第9bit自动翻转。

库函数设置:

UART_Set9bitAutomaticToggle(UART1, DISABLE)

注:在 B8TXD 和 B8POL 的值相同时,在配置完寄存器后传输的第二个数据开始翻转,第一个数据默认为地址位。

Bit8

B8TXD(rw,reset:0x00)UART同步帧发送数据第9bit。

1:发送同步帧第9bit为高电平。

库函数设置:

UART_Set9bitLevel(UART1, ENABLE)

0:发送同步帧第9bit为低电平。

库函数设置:

UART_Set9bitLevel(UART1, DISABLE)

二、程序配置

初始化MM32F013x UART1 9bit通信

从官网下载MM32F013x例程,以MM32F0133C7P的UART1通信为例,增加与UART 9bit通信相关的寄存器位的初始化,这里以库函数方式给出,增加的3行代码如下所示:

//Synchronous frame enable bit UART_CCR Bit11:B8EN
UART_Enable9bit(UART1, ENABLE);
//Synchronous frame transmit UART_CCR Bit8: B8TXD
UART_Set9bitLevel(UART1, DISABLE);
//Synchronous frame auto toggle UART_CCR Bit10:B8TOG
UART_Set9bitAutomaticToggle(UART1, ENABLE);

MM32F0133C7P UART1 9bit通信,初始化代码如下所示:

void bsp_UART1_9Bit_Init(u32 baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
UART_InitTypeDef UART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

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);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
UART_StructInit(&UART_InitStructure);

UART_InitStructure.BaudRate = baudrate;
UART_InitStructure.WordLength = UART_WordLength_8b;
UART_InitStructure.StopBits = UART_StopBits_1;

UART_InitStructure.Parity = UART_Parity_No;
UART_InitStructure.HWFlowControl = UART_HWFlowControl_None;
UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx;
UART_Init(UART1, &UART_InitStructure);

UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);
UART_Enable9bit(UART1, ENABLE);
UART_Set9bitLevel(UART1, DISABLE);
UART_Set9bitAutomaticToggle(UART1, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

UART_Cmd(UART1, ENABLE);
}

1 ● 编写MM32F013x UART1中断函数

MM32F013x UART1中断服务函数,同时将收到的数据发送出去,代码如下所示:

void UART1_IRQHandler(void)
{
u8 res;

if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET)
{
//Receiving interrupts (data received must end at 0x0D 0x0a)
UART_ClearITPendingBit(UART1, UART_IT_RXIEN);

//read receive data.
res = UART_ReceiveData(UART1);

bsp_UART1_Send_Byte(res);
}
}

2 ● 编写MM32F013x UART1发送函数

使用之前工程的MM32F0133C7P UART1发送函数,代码如下所示:

void bsp_UART1_Send_Byte(u8 dat)
{
UART_SendData(UART1, dat);

while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT));
}

MM32F013x UART1 9bit通信功能演示

在main函数中调用SysTick和UART1 9bit通信初始化函数,代码如下所示:

s32 main(void)
{
//SysTick init
DELAY_Init();
//UART1 9bit init
bsp_UART1_9Bit_Init(115200);

while(1)
{
bsp_UART1_Send_Byte(0x55);

DELAY_Ms(500);
}
}

编译工程代码,然后烧录软件到MM32F0133C7P核心板上,用逻辑分析仪抓取UART1 9bit通信发送数据和接收数据的波形:

演示发送数据:
以MM32F0133C7P发送0x55为例,使用逻辑分析仪抓取UART1 9bit通信发送数据的波形如下图所示。

演示接收数据:
上位机串口助手发送0xAA为例,使用逻辑分析仪抓取UART1 9bit通信收到的数据的波形,观察箭头所指第bit9位,如下图3所示:

转自:灵动MM32MCU
审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • uart
    +关注

    关注

    22

    文章

    1278

    浏览量

    104362
  • 灵动微电子
    +关注

    关注

    7

    文章

    131

    浏览量

    20161
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    串行通信和并行通信的区别是什么

    bit by bit)在单条传输线上发送和接收。例如,8位数据“01001001”会分成8个时钟周期依次传输。 结构 :异步串行通信(如UART
    的头像 发表于 07-22 10:55 ?233次阅读

    全面了解串行通信

    、核心概念 数据传输方式 : 串行通信 :数据在单条线路上依次传输,每个时钟周期传输1位(0或1)。 并行通信 :数据通过多条线路同时传输多位(如8位、16位),适合短距离高速传输。 关键术语 : 位(
    的头像 发表于 07-19 14:13 ?170次阅读

    【沁恒CH585开发板免费试用体验】UART 串口通信

    方式,可以实现高速数据通信。 虽然USART既可以同步又可以异步,但是常见的最常用的就是使用功能的异步功能,如果作为异步通信就是UART(U
    发表于 07-08 00:02

    芯知识|广州唯创电子语音芯片UART通信协议解析:发码长度与校验码计算

    一、UART通信协议概述UART(通用异步收发器)是一种广泛应用于嵌入式系统的串行通信协议,其核心特点为无需时钟同步,通过起始位、数据位、校
    的头像 发表于 05-27 08:48 ?259次阅读
    芯知识|广州唯创电子语音芯片<b class='flag-5'>UART</b><b class='flag-5'>通信</b>协议解析:发码长度与校验码计算

    【RA-Eco-RA4M2开发板评测】RA-Eco-RA4M2 串口通信

    就是有效数据,而异步通讯中会包含有的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。 从上面的介绍可以看出,SCI以
    发表于 04-27 23:23

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】UART串口通信-收发回显

    一.串口介绍 USART是全双工通用同步/异步收发器,是一种串行的设备。在嵌入式开发设计中经常被使用到,广泛的被应用于主机与外围设备的通信交互中,应用相当的广泛。 UART和 U
    发表于 12-15 17:32

    ads1278采用同步方式读取ad数据,刚上电时读出来的数据都是0需要过一两秒钟数据才会正常,怎么解决?

    ads1278采用同步方式读取ad数据,在刚上电的时候读出来的数据都是0需要过一两秒钟数据才会正常。麻烦帮忙看下是什么问题。
    发表于 11-29 06:47

    通信协议之SPI总线硬件篇

    , 即同步传输)。 1、支持半双工、全双工通信模式。 2、没有流控制和应答机制来确认是否接收到数据(UART有校验或流控制)。 3、没有一个固定的传输速率规定,已有器件SPI输出速率达到
    的头像 发表于 11-25 17:56 ?2488次阅读
    <b class='flag-5'>通信</b>协议之SPI总线硬件篇

    通信技术:UART串口通信开源代码实操!

    今天我们分享的是关于UART串口通信示例,欢迎大家探讨
    的头像 发表于 11-05 11:56 ?4021次阅读
    <b class='flag-5'>通信</b>技术:<b class='flag-5'>UART</b>串口<b class='flag-5'>通信</b>开源代码实操!

    tlv320aic23b的寄存器地址为什么是7bit而数据却是9bit

    请问音频芯片tlv320aic23b的寄存器地址为什么是7bit 而数据却是9bit
    发表于 10-31 07:47

    UART通信协议介绍和数据传输工作流程

    UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可实现全双工传输和接收。UART通常用来实现与PC之间数据通信,命令和控制信息
    的头像 发表于 10-24 14:20 ?2450次阅读
    <b class='flag-5'>UART</b><b class='flag-5'>通信</b>协议<b class='flag-5'>介绍</b>和数据传输工作流程

    同步通信 VS 异步通信,你选对了吗?

    在嵌入式系统中,通信是实现设备间数据交换的核心。外设和计算机之间通过数据信号线、地线等按位进行传输数据的通信方式就是串行通信同步
    的头像 发表于 10-18 08:04 ?2509次阅读
    <b class='flag-5'>同步</b><b class='flag-5'>通信</b> VS 异步<b class='flag-5'>通信</b>,你选对了吗?

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的异步串行通信技术,它允许两台设备之间进行双向数据传输。在UART通信
    的头像 发表于 10-06 16:12 ?7520次阅读
    <b class='flag-5'>uart</b>波特率和传输频率的关系 <b class='flag-5'>UART</b>串口的常用波特率为多少

    UART串口通讯协议解析

    的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous
    发表于 09-12 16:01

    UART协议的工作原理和应用场景

    UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)协议是一种广泛使用的串行通信协议,它允许计算机与外部设备之间通过串行接口进行数据传输。以下是对UART协议的详
    的头像 发表于 08-25 17:15 ?5986次阅读