DSP28335的RS232串口通讯试验

2023-10-27

目录

前言

一、理论部分

基本概念

SCI数据格式

管脚定义

逻辑电平规定

波特率

二、F28335配置RS232串口通讯

DSP28335SCI控制框图

寄存器配置

三、验证

验证思路

试验环境

关键程序

试验结果


前言

串口通信(Serial Communication)是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,串口通信的接口标准有很多,有 RS-232C、RS-232、RS-422A、RS-485 等。常用的就是 RS-232 和 RS-485。

本文第一部分以RS232C作理论的简要介绍

第二部分和第三部分,用DSP28335实现RS232串行通讯并验证。

文末有完整代码压缩包链接,有需要自取。

一、理论部分

基本概念

串行通信接口(SCI,Serial Communication Interface)是一个双线异步串行端口,通常称为UART。接收和发送有各自独立的信号线(TXD和RXD),但不是同一个时钟。SCI模块支持CPU和使用标准非归零(NRZ)格式的其他异步外围设备之间的数字通信。SCI接收器和发射器各有一个16级深度FIFO,用于减少服务开销,并且各有各自独立的启用位和中断位。二者可以独立操作用于半双工通信,或同时用于全双工通信。

  1. 数据格式通常采用NRZ:标准不归零传号/空号数据格式。不归零的含义是:用正、负电平表示二进制,不适用零电平。传号和空号分别表示1和0。
  2. 比特率可通过16位波特选择寄存器编程为不同速度。
  3. F28335有三个SCI接口。
  4. 具有通信速率自动检测和FIFO缓冲功能。

SCI数据格式

SCI数据的接收和发送都是以下格式:

  • 1个起始位   One start bit
  • 1~8个数据位   One to eight data bits
  • 1个校验位(可选)An even/odd parity bit (optional)
  • 1至2个停止位。 One or two stop bits

用于区分地址和数据的额外位(仅限地址位模式)An extra bit to distinguish addresses from data (address-bit mode only)。

数据的基本单位称为字符,长度为1至8位。数据的每个字符都包含一个起始位、一个或两个停止位以及可选的奇偶校验位和地址位格式化。带有格式信息的数据字符称为帧,下图为从数据手册截图。

 

  1. 奇校验:若字符数据位1的数目是偶数,校验位应为1,如果1的数目是奇数,校验位应为0

  2. 偶校验:若字符数据位1的数目是偶数,校验位应为0,如果1的数目是奇数,校验位应为1

管脚定义

RS-232C 是 EIA(美国电子工业协会)1969 年修订RS-232C 标准。RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。

RS-232C 常用接口是 9 针的连接器接口,简称DB9。现使用的多数都是 DB9 接口。如下图

RS232C接口定义如下表,我们通常并不会每根管脚都使用到,一般只用到TXD、RXD和SGND三个管脚,也就是2、3和5号管脚。其他管脚为数据流量控制等功能所使用。

逻辑电平规定

RS-232C 对逻辑电平也做了规定:

在 TXD 和 RXD 数据线上

  1. 逻辑 1 为-3~-15V 的电压

  2. 逻辑 0 为 3~15V 的电压

由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。而我们dsp使用的是 TTL 电平,所以要实现dsp与计算机的串口通信,需要进行TTL与 RS-232C 电平转换,使用的电平转换芯片是 SP3232。3代表3.3V.

另外,笔记本上没有RS232接口,故完成dsp和PC上位机的通讯还需要一根RS232转USB线。

波特率

波特率baud:单位时间传输的位数

波特率计算公式:

BRR为16位波特值 

SCI Asynchronous Baud为SCI异步通讯波特率

请注意,上述公式仅适用于以下情况:1≤ BRR≤ 65535.

二、F28335配置RS232串口通讯

DSP28335SCI控制框图

tip:参照控制框图查看寄存器的配置会易于理解。

寄存器配置

1、发送器TX及相关寄存器

SCITXBUF:发送数据缓冲器,存放要发送的数据(由CPU装载)

TXSHF:发送移位寄存器,从SCITXBUF接收要发送的数据,当TXENA使能时(即SCICTL1.1位使能),将数据一位一位地移位到SCITXD引脚上,每次移1位数据。

2、接收器RX及相关寄存器

SCIRXBUF:接收数据缓冲器,接收CPU要读取的数据

RXSHF:接收移位寄存器,从SCIRXD引脚一位一位接收数据

来自远程处理器的数据加载到寄存器RXSHF中,若RXENA闭合(即SCICTL1.0位使能),则一位一位送入寄存器SCIRXBUF和SCIRXEMU,我们读取SCIRXBUF就可以获取数据。

 对应代码

	SciaRegs.SCICTL1.all =0x0003;  //SCI控制寄存器1, 发送和接收使能,其他功能不启用

3、可编程波特率产生器

/*SCI波特率设置*/
	scibaud=37500000/(8*baud)-1;
	scihbaud=scibaud>>8;
	scilbaud=scibaud&0xff;

baud为波特率,将变量scibaud赋给Ti提供的波特值寄存器

	SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.
	SciaRegs.SCILBAUD    =scilbaud;

4、数据存储映射的控制和状态寄存器

控制寄存器:可以设置数据格式、通信速率

状态寄存器:可以查看发送和接收的状态

SciaRegs.SCICCR.all =0x0007;   //SCI通信控制寄存器, 1个停止位,8个数据位,没有奇偶校验功能,空闲线协议,屏蔽自测模式

具体配置看数据手册即可。

5、两个外部引脚

SCITXD位SCI数据发送引脚;SCIRXD为SCI数据接收引脚。两个引脚为多路复用引脚。直接调用TI提供的初始化函数InitSciaGpio()。

InitSciaGpio()函数介绍如下:

完整配置代码见第三部分

三、验证

验证思路

上位机和dsp通讯,上位机向dsp发送字符,dsp接收上位机发送的字符并原封不动返回给上位机,上位机打印dsp发送的数据。

试验环境

  1. 上位机×1
  2. DSP开发板(TMS320F28335PGFA)×1
  3. 配套仿真器×1
  4. RS232转USB接口×1
  5. 软件:串口调试助手×1

 

关键程序

寄存器配置

#include "uart.h"


void UARTa_Init(Uint32 baud)
{
	unsigned char scihbaud=0;
	unsigned char scilbaud=0;
	Uint16 scibaud=0;

/*SCI波特率设置*/
	scibaud=37500000/(8*baud)-1;
	scihbaud=scibaud>>8;
	scilbaud=scibaud&0xff;

	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // 打开SCI-A时钟
	EDIS;

	InitSciaGpio();

/*SCI相关工作模式设置*/
	//Initalize the SCI FIFO
	SciaRegs.SCIFFTX.all=0xE040;//SCI发送FIFO寄存器
	SciaRegs.SCIFFRX.all=0x204f;//SCI接收FIFO寄存器
	SciaRegs.SCIFFCT.all=0x0;//SCI FIFO控制寄存器

	// Note: Clocks were turned on to the SCIA peripheral
	// in the InitSysCtrl() function
	SciaRegs.SCICCR.all =0x0007;   //SCI通信控制寄存器, 1个停止位,8个数据位,没有奇偶校验功能,空闲线协议,屏蔽自测模式
	SciaRegs.SCICTL1.all =0x0003;  //SCI控制寄存器1, 发送和接收使能,其他功能不启用
								   // Disable RX ERR, SLEEP, TXWAKE
	SciaRegs.SCICTL2.all =0x0003; //SCI控制寄存器2,使能发送和接收中断
	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,取消软件复位SW RESET

}

/*编写发送函数*/
// Transmit a character from the SCI'
void UARTa_SendByte(int a)
{
	while (SciaRegs.SCIFFTX.bit.TXFFST != 0);//当发送FIFO有数据,还未发送完,则等待。直到FIFO没有数据,即发送完毕,再执行下面语句。

	SciaRegs.SCITXBUF=a;//当发送FIFO发送完毕,给SCITXBUF写入要发送的数据
}

void UARTa_SendString(char * msg)
{
	int i=0;

	while(msg[i] != '\0')
	{
		UARTa_SendByte(msg[i]);
		i++;
	}
}

主函数

void main()
{
	char *msg;
	Uint16 ReceivedChar=0;

	InitSysCtrl();
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();

	LED_Init();
	TIM0_Init(150,200000);//200ms
	UARTa_Init(4800);//通信双方的波特率要尽可能一致。

	msg = "Hello World!\r\n";
	UARTa_SendString(msg);
	msg = "请输入字符,dsp将会返回您输入的字符并在窗口显示!\r\n";
	UARTa_SendString(msg);

	while(1)
	{
		msg = "\r\n输入字符: ";
		UARTa_SendString(msg);

		// Wait for inc character
		while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// 接收x个字符之后,执行读取操作,这里的x为1
		// Get character
		ReceivedChar = SciaRegs.SCIRXBUF.all;

		// Echo character back
		msg = "  Dsp接收到您发送的字符: ";
		UARTa_SendString(msg);//发送提示语
		UARTa_SendByte(ReceivedChar);//将从上位机接收到的字符,原封不动发送回上位机

		DELAY_US(1000);
	}
}

试验结果

使用仿真器将开发板和电脑连接,并且使用USB 转232串口线将开发板串口与电脑连接,烧录程序,点击仿真调试,打开串口调试助手。

这里数据格式配置为8个数据位,1个停止位,无奇偶校验位。波特率设置为4800。

在上位机输入“无咎”20220906,可以看到dsp接收到上位机发送过来的数据,并将数据返回给上位机打印出来。

至此,验证成功。

希望对大家有所帮助。

完整的代码及工程文件,有需要自取:https://download.csdn.net/download/Jaspercai/86510488

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DSP28335的RS232串口通讯试验 的相关文章

随机推荐

  • 27黑马QT笔记之QPixmap和QBitmap的区别

    27黑马QT笔记之QPixmap和QBitmap的区别 前提 首先我们先要了解什么是透明和不透明的图片 1 透明是指显示后与背景颜色一样的 2 不透明就是有自己的颜色 与背景颜色不一样 看下图 前者就是透明的 后者是背景是白色的 是不透明的
  • 详解Python中的三元运算

    详解Python中的三元运算 什么是三元运算符 在大部分编程语言中都有三目运算 也称三元运算 Python语言从Python2 5版本开始也引入了三元运算符 在Python中 三元运算也称为条件表达式 语法如下 true expressio
  • 文件后缀和MIME

    id 后缀名 MIME 0 gif image gif 1 jpg image jpeg 2 png image png 3 bmp image bmp 4 psd application octet stream 5 ico image
  • 锂电池保护板的分类有哪些?

    对于锂电池保护板的认识很多人也是一知半解 并不清楚锂电池保护板具有哪些分类结构 对于如何选择锂电池保护板有些朋友不知道从哪方面着手 那么今天专业生产锂电池保护的锂盾电子带着大家去了解下保护板的分类到底怎样去区分的 保护板可以分为三种种类 三
  • [tensorflow]从Keras加载、保存模型、显示模型权重

    import tensorflow as tf 构建模型 并加载imagenet预训练权重 base model tf keras applications InceptionV3 include top False weights ima
  • python怎么画折线图

    要在 Python 中绘制折线图 你可以使用 matplotlib 库中的 plot 函数 首先 你需要安装 matplotlib 库 这可以使用 pip 包管理器来完成 在终端或命令提示符中输入以下命令 pip install matpl
  • 毛坯房装修

    86平的房子带上家具大概在8 12万左右 硬装 即地面 墙面这些地方瓷砖 水电等装修s 软装 即家具 门框 窗帘等木材 布艺类 全屋定制一般是指 在设计上整体搭配设计 根据整体的设计来定做家具 全屋定制 2 5万 电器 2 5万 5万 窗帘
  • vuex是什么

    vuex是什么 一 vuex是什么 什么是vuex 一 vuex是什么 1 Vuex 是一个专为 Vue js 应用程序开发的状态管理模式 它由五部分组成 分别是 state actions mutations getters module
  • Electron官方实验工具Electron Fiddle

    如果开发者想验证一段简短的代码是否可以在Electron框架内正常运行 那么自己创建个Electron项目 再搞个开发调试环境 就太麻烦了 Electron官方团队为开发者提供了一个更快捷的创建项目并进行试验的工具 Electron Fid
  • 豪华气派!这些院校的图书馆也太美了!

    博尔赫斯曾经说过 我心里一直都在暗暗设想 天堂应该是图书馆的模样 图书馆作为校园里的重要建筑 可以说是大学的门面 很多同学在择校时也会重点关注学校的图书馆 把它作为了解学校底蕴的通道和入口 今天我们就来看看各大高校的神仙图书馆吧 北京大学图
  • ffmpeg vscode debug编译错误【已解决】

    1 make no targets Stop 修改方式 make j N 这个N查看本机有多少个核 问题查找参考链接 https github com openresty openresty issues 22 2 the EAI MEMO
  • 线性回归和逻辑回归(LR)

    回归就是输出值是连续的而不是离散的 如果是离散值 就是分类问题 1 线性回归 1 定义 给定数据集D x1 y1 x2 y2 线性回归尝试学习到一个线性模型 尽可能地输出正确标记 线性回归无非就是在N维空间中找一个形式像直线方程一样的函数来
  • 如何用3个月零基础入门网络安全?

    一 自学网络安全学习的误区和陷阱1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 我在之前的回答中 我都一再强调不要以编程为基础再开始学习网络安全 一般来说 学习编程不但学习周期长 而且实际向安全过渡后可用到的关键知识并不多 一
  • React实现自定义双向数据流

    ng是双向数据流 VM双向数据绑定 而react与vue都是单向数据流 model层的数据流向view层 今天 我们就尝试自定义实现双向数据流 案例 组件中通过监听input内容变化 进而赋值 class Bar extends React
  • windows下使用cmake+mingw配置makefile(一)

    1 下载Cmake 并配置环境变量 下载链接 https cmake org download 环境变量略 2 生成Makefile 1 新建 hello 文件夹 在hello中创建hello c测试程序 mkdir hello cd C
  • Git 在AS上的操作总结+图解(仓库创建,分支的创建,切换,更新,合并,版本回退)

    简述 本文主要是按顺序进行描述的 创建仓库 创建项目 关联并提交 创建分支 将分支合并到主分支上去 版本的回滚 分支的更新 以及一些注意事项 使用AS创建一个项目 1 创建本地仓库 就会在选中的目录下面创建一个git仓库 关联本地库成功之后
  • day87(6.7函数的重载)

    1 函数的重载 函数的重载就是在同一个类中允许同时存在一个以上的同名函数 只要它们的参数个数或类型不同即可 在同一个类中可以定义多个 同名 方法 方法名重载 overload public class PrintStream public
  • Python兼职半月赚了5570元:边学习边赚钱真的很爽!

    前几天去参加朋友聚会 还没聊几句 就看到阿杰手机 叮 地一声 弹出一条推送 支付宝已到账 5570元 我开玩笑说 你暑假都有这么多生活费啊 羡慕了 快乐都是别人的 没想到阿杰说 除了管爸妈要生活费 我还不能搞点副业儿养活自己吗 我不酸 仔细
  • 尽量使用 useReducer,不要使用 useState

    原文 useReducer don t useState 本文难度 入门级别 本文默认你已经大概了解过 React Hooks 如果不了解可以先看看 ReactJS 的文档 当开发者们开始在他们的应用中使用 React Hooks API
  • DSP28335的RS232串口通讯试验

    目录 前言 一 理论部分 基本概念 SCI数据格式 管脚定义 逻辑电平规定 波特率 二 F28335配置RS232串口通讯 DSP28335SCI控制框图 寄存器配置 三 验证 验证思路 试验环境 关键程序 试验结果 前言 串口通信 Ser