【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信

文章目录

 

前言

背景介绍

SCI通信

Transmitter

Receiver

SCI中断

分析和应用

总结

参考资料


前言

        见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》

背景介绍

        近期使用TI C2000 DSP做的一个嵌入式系统开发项目中,在使用它的SCI(serial communication interface)通信时,遇到了挺多费时费力的事情。所以利用周末时间,在这些方面深入研究了一下,解锁了一些新技能。把它总结出来,以备将来翻看。

SCI通信

        TI C2000 DSP中的SCI(serial communication interface)通信,跟常见的UART(Universal Asynchronous Receiver/Transmitter)非常类似,大部分内容都是相同的。由于这个芯片的DSP定位,所以SCI相比UART多了一些增强的功能,比如SCI支持多处理器之间以总线的方式寻址通信,并具备专门的地址匹配功能。再比如transmitter和receiver都有16-level deep FIFO,可以16 frame统一处理一次,能够减轻CPU的负荷。SCI在芯片中的工作原理如下图所示:

        Tips:CPU和SCI通信接口之间的数据传递有两条路径可选,分别是经过FIFO和不经过FIFO,通过上图中的寄存器SCIFFENA即可配置。

Transmitter

        SCI的数据发送过程如下:

        第一步,CPU将Bytes到移SCITXBUF。如果是非FIFO模式,一次只能移一个Byte,等着发送完了才能移下一个。如果是FIFO模式,最多可以依次移入16个Bytes,然后他们在FIFO中排队往外发送。

        第二步,shift register (TXSHF)逐个将SCITXBUF或FIFO中的Byte包装上头、尾和奇偶校验位,组成完整Frame。

        第三步Tx line上以串行0和1的形式发送出去。

        发送应用的代码示例如下:

//*****************************************************************************
// SCI_writeCharArray
//*****************************************************************************
void
SCI_writeCharArray(uint32_t base, const uint16_t * const array,uint16_t length)
{// Check the arguments.ASSERT(SCI_isBaseValid(base));uint16_t i;// Check if FIFO enhancement is enabled.if(SCI_isFIFOEnabled(base)){// FIFO is enabled.// For loop to write (Blocking) 'length' number of charactersfor(i = 0U; i < length; i++){// Wait until space is available in the transmit FIFO.while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX15){}// Send a char.SCI_O_TXBUF = array[i];}}else{// FIFO is not enabled.// For loop to write (Blocking) 'length' number of charactersfor(i = 0U; i < length; i++){// Wait until space is available in the transmit buffer.while(!SCI_isSpaceAvailableNonFIFO(base)){}// Send a char.SCI_O_TXBUF = array[i];}}
}

Receiver

        SCI的数据接收过程如下:

        第一步Rx line上由0和1组成的串行数据到达Rx pin,

        第二步RXSHF把包含头、尾和校验位的完整Frame转换成有效的Byte,然后分两种路径,要么直接放入receiver buffer register (SCIRXBUF),要么依次压入RX FIFO,同时产生一个RX interrupt送到CPU。

        第三步,CPU得到interrupt request后就可以执行一个ISR(中断服务程序),把SCIRXBUF(1 Byte)中的Byte移到可用的变量或数组中。如果芯片配置的是FIFO模式,那么FIFO(16 Byte)中的Byte会以先进先出的顺序逐个自动进入SCIRXBUF,直至FIFO拿空为止。

        接收应用的代码示例如下:

//*****************************************************************************
// SCI_readCharArray
//*****************************************************************************
void SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length)
{// Check the arguments.ASSERT(SCI_isBaseValid(base));uint16_t i;// Check if FIFO enhancement is enabled.if(SCI_isFIFOEnabled(base)){// FIFO is enabled.// For loop to read (Blocking) 'length' number of charactersfor(i = 0U; i < length; i++){// Wait until a character is available in the receive FIFO.while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0){}// Return the character from the receive buffer.array[i] = (uint8_t)SCI_O_RXBUF;}}else{// FIFO is not enabled.// For loop to read (Blocking) 'length' number of charactersfor(i = 0U; i < length; i++){// Wait until a character is available in the receive buffer.while(!SCI_isDataAvailableNonFIFO(base)){}// Return the character from the receive buffer.array[i] = (uint8_t)SCI_O_RXBUF;}}
}

SCI中断

        在TI C2000 DSP的中断向量表中有两个SCI相关的中断,分别是TXINTRXINT。这两个中断各自都有多个触发源,每个触发源都有自己的Flag寄存器Enable寄存器,使能寄存器用来配置该触发源是否触发CPU中断。下面以接收中断为例来进行讲解:

        RX FIFO Interrupt可以配置为0~16 Level,Level 0表示不使能RX FIFO Interrupt,Level 1表示RX FIFO中的Bytes个数是1的时候触发中断,Level 2示RX FIFO中的Bytes个数是2的时候触发中断,以此类推。FIFO的中断Level可以配置成各种值,但是实际可压入的Bytes空间不会变。这里的Level设置越小就会越频繁的触发CPU中断,软件对SCI的相应速度也越快,但是CPU的负荷也会越高,需要开发人员根据自己的应用设计一个合适的Level。

        Break Detect Interrupt是指在Frame中出现了bit间隔,芯片是以Start位和Stop位作为判定的条件。如果一个Frame定义的是11bit,那么收到Start位之后如果10个bit时间过去了还没收到Stop位,那就判定为Break Detect Error,寄存器BRKDT就会置1。

        这些寄存器通常以SCIRXBUF接收到完整Frame为时间点进行update,一旦置1后不会自动清0,需要在RXINT的ISR(中断服务程序)写代码处理。ISR执行完之前,又有新的Frame进来时会出错,官方建议ISR的执行时间要小于0.125 bit time。

分析和应用

        TI C2000 DSP的SCI通信具有协议简洁,易于调试和快速开发的特点,因此被广泛应用于物联网的嵌入式系统中。这些特点决定了它适用于数据量不大,通信速率要求不高,传输距离较近的应用场景,并且对刚入门的开发人员非常友好。

总结

        以上就是本人在研发中使用嵌入式处理器SCI通信时,一些个人理解和分析的总结,主要介绍了SCI通信的工作原理,展示了具体的使用方法,并对比分析了它的特点适用场景

        后续还会分享另外几个最近解锁的嵌入式处理器新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。

参考资料

        TMS320F28003x Real-Time Microcontrollers datasheet.pdf


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393494.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch系列-张量的类型转换

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 张量转换为NumPy数组 使用Tensor.numpy()函数可以将张量转换为ndarray数组 # 1.将张量转换为numpy数组 data_tensortorch.tensor([2,3,4]) # 使用张量对象中的numpy函数进行转…

c++STL中list介绍,模拟实现和list与vector对比

目录 前言 &#xff1a; 1. list的介绍及使用 1.1list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对…

串行并行数据转换

前言 串行数据传输通常在数据传输距离较远时使用&#xff0c;而并行数据传输适用于短距离、高速数据交换。通过转换&#xff0c;可以根据实际需求选择合适的传输方式&#xff0c;以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真&#xff0c;因为…

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能&#xff0c;因为转换速度原因&#xff0c;最后选用了libreoffice&#xff0c;原因及部署请参考 linux ubuntu环境安装libreoffice&#xff0c;word转pdf 远程调用的话可选docker部署&#xff0c;请看2.3.1 二、springboot整合libr…

达梦数据库的系统视图v$mem_pool

达梦数据库的系统视图v$mem_pool 达梦数据库的V$MEM_POOL视图主要用于显示所有内存池的信息。通过查询这个视图&#xff0c;用户可以监控数据库中各个内存组件的使用状况&#xff0c;包括内存池的大小、使用情况等。这有助于用户判断内存池是否空闲或紧张&#xff0c;从而进行…

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢&#xff1f;机…

Unity射击游戏开发教程:(31)制造一定追踪行为的敌人

在本文中,我们将介绍如何在两种敌人行为之间切换。本文是前两篇文章的延续,分别介绍了敌人躲避玩家射击以及敌人不断旋转并向玩家射击的情况。我只是介绍如何在这两种行为之间进行转换。 这种新的敌人行为的目标: 当不开火时,敌人可以躲避玩家的射击。射击时,敌人无法躲避…

谷粒商城实战笔记-137-商城业务-首页-整合dev-tools渲染一级分类数据

文章目录 一&#xff0c;使用热加载工具spring-boot-devtools1&#xff0c;引入devtools依赖2&#xff0c;ctrlshiftf9 编译静态资源 二&#xff0c;thymeleaf原理三&#xff0c;渲染一级分类 一&#xff0c;使用热加载工具spring-boot-devtools 因为我们采用的前后端一体的开…

全国首例 腾讯《穿越火线》协助破获DMA外挂案

据腾讯游戏安全中心公告&#xff0c;腾讯旗下的游戏《穿越火线》协助警方破获了首例DMA外挂案件。DMA即Direct Memory Access&#xff08;直接内存访问&#xff09;&#xff0c;原本是一种读写数据的计算机技术。 DMA外挂则通过特殊的软硬件工具直接访问电脑内存&#xff0c;读…

MIMO技术入门(通俗易懂)

MIMO技术的思路 形象地形容就是&#xff0c;从原来的一个人在搬砖&#xff0c;转变成多个人在搬砖。 MIMO/SIMO/MISO示意图 MIMO用专业一点的词形容&#xff0c;就是发射端和接收端都有多个天线&#xff0c;这里的多天线并不是指有多个天线板&#xff0c;对于基站来说&#…

基于Raft算法的分布式KV数据库:六、常见问题及解答

CPPRaft系列-常见问题及解答 】 目前项目中还有很多地方可以优化&#xff0c;欢迎大家参与吼吼吼。 地址在&#xff1a; https://github.com/youngyangyang04/KVstorageBaseRaft-cpp 在前面的系列文章中&#xff0c;我对这个项目提出了很多问题&#xff0c;但是发现没有解答…

科普文:微服务之全文检索ElasticSearch忝删改查详细操作说明

一、Restful简介 RESTFul&#xff1a;Representational State Transfer&#xff0c;中文意思&#xff1a;表现层状态转化。变现层指的是资源的表现层&#xff0c;这里的资源是指网络上的信息&#xff0c;比如一张图片&#xff0c;一段文本&#xff0c;一步电影&#xff0c;那么…

Python | Leetcode Python题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0

[Git][分支设计规范]详细讲解

目录 0.概览1.master分支2.release分支3.develop分支4.feature分支5.hotfix分支 0.概览 以下是常用的分支和环境的搭配&#xff0c;可视情况而定不同的策略 分支名称适用环境master主分支生产环境release预发布分支预发布/测试环境develop开发分支开发环境feature需求开发分支本…

systemd-manage系统服务图形化管理工具使用教程

1. systemd-manage介绍 systemd-manage是一个开源的基于systemd服务管理的图形化工具&#xff0c;使用qt图形库进行开发&#xff0c;可以提供服务管理&#xff0c;用户会话&#xff0c;配置文件修改&#xff0c;日志查询&#xff0c;性能分析&#xff0c;进程管理等功能。图形…

AGV一体式ARM智能控制主机如何替代传统PLC、工控机等方案

工业自动化的不断发展&#xff0c;AGV&#xff08;自动导引车&#xff09;作为一种重要的物流搬运设备&#xff0c;在各个领域得到了广泛的应用。而 AGV 的控制主机是其核心部件之一&#xff0c;直接影响着 AGV 的性能和稳定性。传统的 AGV 控制主机通常采用 x86 工控机交换机i…

HTTPS协议讲解

HTTPS协议讲解 HTTPS是什么理解加密什么是加密为什么要加密 常见的加密方式对称加密非对称加密 数据摘要/数据指纹HTTPS的工作过程探究方案一&#xff0c;只使用对称加密方案二&#xff0c;只使用非对称加密方案三&#xff0c;双方都是用非对称加密方案四&#xff0c;非对称加密…

24/8/6算法笔记 不同核函数

import numpy as np from sklearn import datasets from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt 加载数据 X,ydatasets.load_wine(return_X_y True) d…

运维工作中对反爬虫的一些思考

最近运维工作中单位的网站被攻击&#xff0c;我们的反爬虫系统已经比较严格了&#xff0c;突然有5个用户登录30多万次经我们查找发现&#xff0c;用户是正常登录&#xff0c;这一异常被我们的技术部门捕捉到第一时间响应&#xff0c;没想到常规架构已经不足以应付现在的技术了&…

机器学习练手(二):基于KMeans的股票分类

总结&#xff1a;本文为和鲸python 机器学习原理与实践闯关训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 原活动链接 在前一关我们学习了逻辑回归&#xff0c;学会如何训练模型、数据基础性分析、如何处理空值等操作&#xff0c;下面我们…