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

news2024/11/23 23:58:39

文章目录

 

前言

背景介绍

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 characters
        for(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 characters
        for(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 characters
        for(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 characters
        for(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.coloradmin.cn/o/1987223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

缓存异常:缓存雪崩、击穿、穿透

缓存异常&#xff1a;缓存雪崩、击穿、穿透 缓存雪崩 定义 大量的应用请求无法在 Redis 缓存中进行处理&#xff0c;会将这些请求发送到数据库&#xff0c;导致数据库的压力激增&#xff0c;是发生在大量数据同时失效的场景下 原因 1. 缓存中有大量数据同时过期&#xff0…

常见中间件漏洞复现之【Apache】!

CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者…

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

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

实操: 如何在AirBox上跑Stable Diffusion 3

以下文章来源于Radxa &#xff0c;作者瑞莎 Stable Diffusion 3 Medium 是一种多模态扩散变换器 (MMDiT) 文本到图像模型&#xff0c;在图像质量、排版、复杂提示理解和资源效率方面具有显著提升的性能。 目前瑞莎团队使用 Stable Diffusion 3 Medium 开源模型&#xff0c;通过…

领域驱动设计实战:使用Wow框架重构银行转账系统

银行账户转账案例是一个经典的领域驱动设计&#xff08;DDD&#xff09;应用场景。 接下来我们通过一个简单的银行账户转账案例&#xff0c;来了解如何使用 Wow 进行领域驱动设计以及服务开发。 银行转账流程 准备转账&#xff08;Prepare&#xff09;&#xff1a; 用户发起…

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…

python中的turtle库(适用于计算机二级)

窗体函数 turtle.setup(width,height,startx,starty) width:窗口宽度 height:窗口高度 startx&#xff1a;窗口与屏幕左侧的距离 starty&#xff1a;窗口与屏幕顶部的距离 常用的引进turtle方法 # 引入turtle import turtle# 引入turtle库中的所有函数 from turtle import *# …

如何使用AI提问提示词(Prompt):让你的提问回答更有效

现在AI模型在日常工作和生活中的应用越来越广泛&#xff0c;无论是生成文本、回答问题&#xff0c;还是进行对话互动&#xff0c;提示词&#xff08;Prompt&#xff09;在与AI交互时起着至关重要的作用&#xff0c;一个好的提示词可以引导AI生成更加准确、有价值的内容。 那么…

【简历】宜春某二本学院:Java简历指导,秋招简历通过率低

简历说明 这是一个25届的二本宜春某学院的这个Java简历&#xff0c;今天看了两个简历&#xff0c;包括前面个985的&#xff0c;也是12306&#xff0c;这个12306已经烂大街&#xff0c;是个人都知道这个项目了&#xff0c;所以不要放在简历上&#xff0c;你不管大厂中厂还是小公…

力扣——11.盛最多水的容器

题目 暴力解 思路&#xff1a; 遍历每一个可能组成的容器&#xff0c;然后计算比较最大值。 代码&#xff1a; int maxArea(vector<int>& height) {int z1 0, z2 0;int len height.size();int val 0;for (z1; z1 < len - 1; z1) {for (z2 z1 1; z2 < l…

5分钟0基础快速上手亚马逊云科技AWS核心云开发/云架构知识 - 利用S3桶托管网页静态资源

简介&#xff1a; 小李哥从今天开始将开启全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家0基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构。 我将每天介绍一个基于亚马逊云…

Day-16 SpringBoot原理

SpingBoot原理 在前面十多天的课程当中&#xff0c;我们学习的都是web开发的技术使用&#xff0c;都是面向应用层面的&#xff0c;我们学会了怎么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇&#xff0c;主要偏向于底层原理。 我们今天的课程安…

AppBoot:像 Django 一样使用 FastAPI

App Boot 开发 AppBoot 的背景是我一直没能寻找到满意的 FastAPI 项目模板。相比之下&#xff0c;Django 的项目结构和开发方式一直深得我心&#xff0c;因此我决定创建一个类似 Django 的 FastAPI 项目模板。 AppBoot 完全采用异步模式&#xff0c;内置 SQLAlchemy 2.0&…

Debian | Vscode 安装与配置 C 环境

Debian | Vscode 安装与配置 C 环境 安装 vscode sudo apt update sudo apt install software-properties-common apt-transport-https curlcurl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -sudo add-apt-repository "deb [archamd64…

Golang | Leetcode Golang题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; import "math/rand" // 默认导入的 rand 不是这个库&#xff0c;需要显式指明type node struct {ch [2]*nodepriority intkey intdupCnt intsz int }func (o *node) cmp(b int) int {switch {case b < o.k…

独家探讨BIGO ads投放海外休闲游戏广告优势

在探讨BIGO投放海外休闲游戏广告的优势时&#xff0c;不得不提的是其全球化的战略布局与强大的技术支撑。BIGO作为深耕海外市场的先行者&#xff0c;已经构建了覆盖全球多个国家和地区的用户网络&#xff0c;这为休闲游戏广告的广泛传播提供了得天独厚的条件。通过精准定位不同…

ARM 汇编语言基础

目录 汇编指令代码框架 汇编指令语法格式 数据处理指令 数据搬移指令 mov 示例 立即数的本质 立即数的特点 立即数的使用 算术运算指令 指令格式 add 普通的加法指令 adc 带进位的加法指令 跳转指令 Load/Store指令 状态寄存器指令 基础概念 C 语言与汇编指令的关…

日志和守护进程

日志 //日志就是服务器在运行的时候要定期的把执行痕迹保留下来 #pragma once #include <iostream> #include <string> #include <cstdio> #include <cstring> #include <ctime> #include <cstdarg> #include <sys/types.h> #inclu…

XFS寻址模拟

XFS寻址 XFS 大部分时候都会用绝对地址&#xff0c;即包含AG信息和相对AG偏移量的信息&#xff0c;但有些时候会使用相对地址“相对AG的偏移量” [rootip-172-31-35-68 ~]# xfs_db -r /dev/nvme1n1 xfs_db> sb 0 xfs_db> p magicnum 0x58465342 blocksize 4096 dbloc…

丰富IO接口的ARMxy工业计算机在装卸机中的应用

在工业装卸领域&#xff0c;高效、精准的装卸作业对于提高生产效率和降低成本至关重要。ARMxy 工业计算机凭借其丰富的 IO 接口和强大的性能&#xff0c;成为工业装卸机的智能控制核心&#xff0c;为装卸作业带来了全新的变革。 ARMxy 工业计算机自带丰富的 IO 接口&#xff0c…