我是靠谱客的博主 稳重香水,最近开发中收集的这篇文章主要介绍关于DSP的SCI通信学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.关于通信的基本概念

异步通信与同步通信?

  1. 异步通信:发送和接收方使用各自的时钟控制数据的发送和接收。以帧为单位进行传输,字符与字符之间的间隙任意。但是每个字符要加2-3位用于起止位,各帧之间还有间隔。——效率低。
    在这里插入图片描述

  2. 同步通信:需要建立发送方时钟和接收方时钟的直接控制,使双方达到完全同步。
    在这里插入图片描述

单工,半双工

  1. 单工:数据传输仅能沿一个方向,不能反向传输。
  2. 半双工:数据传输可以沿两个方向,但要分时进行。

2.UART-通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)

在这里插入图片描述
整个数据的组成就是第一张图:
在这里插入图片描述

空闲位:

UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平

起始位:

开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。因为空闲位一直是高电平所以开始第一次通讯时先发送一个明显区别于空闲状态的信号即为低电平。

数据位:

起始位之后就是要传输的数据,数据可以是5,6,7,8,9位,构成一个字符,一般都是8位。先发送最低位最后发送最高位。

奇偶校验位:

数据位传送完成后,要进行奇偶校验,校验位其实是调整个数,串口校验分几种方式:
1.无校验(no parity)
2.奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇数,校验位为’0’。
3.偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位为’1’。
4.mark parity:校验位始终为1
5.space parity:校验位始终为0
停止位:
数据结束标志,可以是1位,1.5位,2位的高电平。
————————————————
版权声明:本文为CSDN博主「sternlycore」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
参考:https://blog.csdn.net/sternlycore/article/details/85244515

3.DSP中的SCI,即UART

在这里插入图片描述
2个外部引脚:SCITXD是SCI数据发送引脚,SCIRXD是SCI数据接收引脚。
数据格式:一个启动位+1~8位可编程数据字长度+可选择校验方式+4中错误方式检测+2种唤醒多处理方式+全双工或半双工通信模式+双缓冲接收和发送功能。
全双工或半双工模式
双缓冲接收和发送功能
在这里插入图片描述

SCI信号接收

在这里插入图片描述
标志位RXENA为1,使能接收;数据从寄存器移位到接收缓冲器SCIRXBUF,会产生中断申请,标志位RXRDY为1,表示已接收一个新字符。程序读SCIRXBUF寄存器,标志位RXRDY自动清除

SCI信号发送

在这里插入图片描述
TXENA,使能发送;写数据到SCITXBUF,从而发送器不再为空,TXRDY为低。SCI发送数据到移位寄存器。发送器准备传送第2个字符(TXDRY为高),并发出中断请求。

波特率

在这里插入图片描述

程序设计

//初始化
void UARTa_Init(Uint32 baud)
{
unsigned char scihbaud=0;
unsigned char scilbaud=0;
Uint16 scibaud=0;
scibaud=37500000/(8*baud)-1;
scihbaud=scibaud>>8
scilbaud=scibaud&0xff;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
InitSciGpio();
//Initalize the SCI FIFO
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x204f;
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;//不阻止
SciaRegs.SCICTL2.bit.RXBKINTENA =1;//不阻止
SciaRegs.SCIHBAUD =scihbaud; // 9600 baud @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD =scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
//发送数据
void UARTa_SendByte(int a)//单个字节的发送
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);//发送FIFO不是空的
SciaRegs.SCITXBUF=a;
}
void UARTa_SendString(char * msg)
{
int i==0;
while (msg[i] != '')
{
UARTa_SendByte(msg[i]);
i++
}
}

最后

以上就是稳重香水为你收集整理的关于DSP的SCI通信学习的全部内容,希望文章能够帮你解决关于DSP的SCI通信学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部