MPC5744P-SPI

article/2025/10/25 3:14:15

1.结构
5744的SPI模块支持全双工三线同步传输,可运行在主机或从机模式,分别含有深度为5的FIFO发送和接收缓存区。其结构如下图。SPI配置允许模块发送和接收串行数据,同时也支持带FIFO缓存区的的进行扩展队列操作的数据传输。模块接收和发送的数据存放在独立的FIFO内,CPU或DMA控制器从接收FIFO读取数据,写入数据到Tx FIFO内进行发送。

2、传输过程
1)发送过程

发送数据时CPU先查询寄存器SR内TFFF的状态,若TFFF为为0则表明TX FIFO已满,继续写入无效;当TFFF为1则表明TX FIFO未满,可以继续写入。CPU通过写数据到寄存器PUSHR将要发送的数据添加到TX FIFO内,TX FIFO根据先入先出的顺序将数据移入移位寄存器进行发送,只要TX FIFO内有有效的数据,则一直进行发送。在每一次成功传输后,寄存器SR内的TCF被置位表明一次成功的传输。寄存器SR的TXCTR值阈计数TX FIFO内的有效数据数,当有数据被压入或被传送到移位寄存器时,TXCTR随之更新。当PUSHR寄存器中EOQ==1的数据被传输完成后,寄存器SR中的EOQF置位表明数据队列被全部发送完毕,可用于指示多个数据的发送完毕。

2)接收过程

当移位寄存器内的数据接收完成后,接收到的数据被添加到RX FIFO内,CPU通过读POPR寄存器将数据从RX FIFO内取出。当RX FIFO 不为空,寄存器SR中的RFDF被置位,当读取数据时,CPU先查询寄存器SR内RFDF的状态,若RFDF为0则表明RX FIFO为空,继续读取数据无效;当RFDF为1则表明RX FIFO不为空,可通过读POPR寄存器来读取RX FIFO内的数据。相应地,寄存器SR的RXCTR值阈计数RX FIFO内的有效数据数,当有数据被移入到RX FIFO 或被CPU通过POPR取出时,RXCTR随之更新。

3、传输模式
SPI传输可分为主机模式和从机模式,也有经典模式和改进模式。本文以经典主机模式为例。主机模式下SCK、PCS、SOUT为输出,SIN为输入。

1)CPHA=0

 如下图CPHA=0时,数据捕捉在SCK的奇数跳边沿,数据变化在SCK的偶数跳边沿。与之相对应地若CPOL=0,SCK高电平有效,则数据捕捉在SCK的上升沿,数据变化在SCK的下降沿;若CPOL=1,SCK低电平有效,则数据捕捉在SCK的下降沿,数据变化在SCK的上升沿。

2)CPHA=1

如下图所示,当CPHA=1,数据捕捉在SCK的偶数跳边沿,数据变化在SCK的奇数跳边沿。相应地若CPOL=0,SCK高电平有效,则数据捕捉在SCK的下降沿,数据变化在SCK的上升沿;若CPOL=1,SCK低电平有效,则数据捕捉在SCK的上升沿,数据变化在SCK的下键沿。

3)持续片选模式和非持续片选模式

持续片选模式是指在两个数据帧之间片选信号PCS一直保持有效为低电平;非持续片选模式是指在两个数据帧之间片选信号PCS变为无效,二者区别如下图所示。持续片选和非持续片选模式有寄存器PUSHR[CONT位决定,PUSHR[CONT]=0选择非持续片选,PUSHR[CONT]=1选择持续片选。具体选择哪种方式要根据所要驱动的外设来确定,由于该模式有PUSHR寄存器选择,故在发送数据时要求连续数据持续片选和非持续片选要保持一致,不可混合使用,否则会造成传输错误。

4.波特率和时序延时
SPI中协议时钟即是外设桥时钟,也就是在时钟模块所配置的时钟频率,文中缩写为fp。

1)波特率

波特率即是SCK的频率。SPI的波特率由寄存器CTARn中DBR、PBR和BR决定,计算公式如下。其中Prescaler由PBR决定,Scaler由BR决定,对应关系如下表。

 

2)tcsc

tcsc是指从PCS有效到SCK第一个跳变沿的时间,由CTARn寄存器中PCSSCK和CSSCK决定。

3)tasc

tasc时钟从SCK最后一个跳边沿到PCS无效的时间,由CTARn寄存器中PASC和ASC决定。

4)tdt

tdt是指本次传输PCS无效到下次传输PCS有效的时间。

各个延时值如下图所示:

5.初始化
5744初始化步骤如下所示:

1)运行模式选择;

2)管脚复用功能配置;

1)使能SPI模块,停止传输以进行寄存器的配置;

2)配置CTARn以进行数据长度、传输模式、波特率和延时的设置,每个CTAR可有不同的配置,PUSHR写入数据到TX FIFO时可根据需要选择不同的CATR寄存器。

3)启动传输过程。

示例代码如下:

/******************************************************
 * 函数名        SPI_SPI0_Init
 * 功能          对SPI0模块进行初始化
 * 输入参数      无
 * 返回值        无
 * 示例          SPI_SPI0_Init();//初始化SPI0
 ******************************************************
 */
void SPI_SPI0_Init()
{
    //运行模式选择
    MC_ME.PCTL99.B.RUN_CFG=0;       //选择运行模式0
 
    //管脚多路复用配置
    SIUL2.MSCR[36].B.SSS=1;         //PC4,选择作为SPI0_PCS0
    SIUL2.MSCR[36].B.OBE=1;
    SIUL2.MSCR[36].B.SRC=3;
 
    SIUL2.MSCR[37].B.SSS=1;         //PC5,选择作为SPI0_SCK
    SIUL2.MSCR[37].B.OBE=1;
    SIUL2.MSCR[37].B.SRC=3;
 
    SIUL2.MSCR[38].B.SSS=1;         //PC6,选择作为SPI0_SOUT
    SIUL2.MSCR[38].B.OBE=1;
    SIUL2.MSCR[38].B.SRC=3;
 
    SIUL2.IMCR[41].B.SSS=1;         //PC7,选择作为SPI0_SIN
    SIUL2.MSCR[39].B.IBE=1;
 
    //SPI配置
    SPI_0.MCR.B.MDIS=0;             //使能SPI模块
    SPI_0.MCR.B.HALT=1;             //停止传输
    SPI_0.MCR.B.MSTR=1;             //选择主机模式
    SPI_0.MCR.B.PCSIS=1;            //PCS0无效状态为高
 
    //CTAR[0]寄存器
    SPI_0.MODE.CTAR[0].B.FMSZ=7;    //配置数值长度为8=FMSZ+1
 
        //以下两位要根据对应外设选择,否则SPI通信会失败!!!
 
    SPI_0.MODE.CTAR[0].B.CPHA=1;    //数据捕捉在偶数跳变沿
    SPI_0.MODE.CTAR[0].B.CPOL=1;    //SCK低电平有效
 
    SPI_0.MODE.CTAR[0].B.PCSSCK=2;  //tcsc=5*8/45mhz=0.875us
    SPI_0.MODE.CTAR[0].B.CSSCK=2;
 
    SPI_0.MODE.CTAR[0].B.PASC=2;    //tacs=5*8/45mhz=0.875us
    SPI_0.MODE.CTAR[0].B.ASC=2;
        
        //波特率=(fP/PBR)x[(1+DBR)/BR]=45mhz/5*(1+0)/4=2.25MHz
    SPI_0.MODE.CTAR[0].B.PBR=2;     
    SPI_0.MODE.CTAR[0].B.BR=1;
 
    SPI_0.MODE.CTAR[0].B.PDT=2;
    SPI_0.MODE.CTAR[0].B.DT=13;    //tdt=5*32768/45mhz=3.64ms
 
    SPI_0.MCR.B.HALT=0;            //开始传输
 
}
6.数据发送
发送数据通过将数据写入PUSHR寄存器发送。其实PUSHR寄存器除数据部分外,还有命令部分,可根据需要进行选择。

CONT选择是否为持续片选模式
CTAS用于选择初始化中设置的CTAR寄存器用以选择用于传输的数据长度、传输模式、波特率和延时等。
EOQ用于标识是否为数据队列的最后一帧数据
PCS用于选择片选引脚。
发送步骤为:

1)将数据写入PUSHR寄存器;

2)清空SR寄存器EOQF位开始发送;

3)等待发送完成;

4)清除发送完成标志位;

代码如下:

/******************************************************
 * 函数名       SPI_SPI0_Write
 * 功能         通过SPI0发送指定数据
 * 输入参数
 *              data
 *              要发送的数据
 * 返回值       无
 * 示例         SPI_SPI0_Write(tempData);//通过SPI发送数据tempData
 ******************************************************
 */
void SPI_SPI0_Write(uint32_t data)
{
 
    uint32_t temp_data;
    temp_data=0x08010000|data;      //置位EOF标志为最后一帧数据,选择PCS0为片选引脚
    SPI_0.PUSHR.PUSHR.R=temp_data;
    SPI_0.SR.B.EOQF=1;              //开始传送
    while(!SPI_0.SR.B.TCF);         //等待传送完成
    SPI_0.SR.B.TCF=1;               //清除发送标志位
}
7.数据接收
数据接收时需要等待RX FIFO不为空,也即是SR寄存器RFDF为1。若RFDF为1,则通过读取POPR寄存取来读取数据,然后清空对应标志位。示例代码如下:

/******************************************************
 * 函数名      SPI_SPI0_Read
 * 功能        通过SPI0读取数据
 * 输入参数    无
 * 返回值      通过SPI0所读取到的数据
 * 示例        uint32_t tempData=SPI_SPI0_Read();//通过SPI0读取数据到tempData
 ******************************************************
 */
uint32_t SPI_SPI0_Read()
{
    uint32_t recv_data=0;
    while (SPI_0.SR.B.RFDF != 1);         //等待Rx FIFO不为空
    recv_data= SPI_0.POPR.R;              //读取接收到的数据
    SPI_0.SR.R = 0xFCFE0000;              //清空相应标志位
    return recv_data;
}


http://chatgpt.dhexx.cn/article/7eE4rJxZ.shtml

相关文章

SPI协议、MCP2515裸机驱动详解----主流SPI总线接口原理

最近看到一个介绍SPI接口原理的帖子,看完觉得甚好。特来分析给大家一起学习。 SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟&#…

MP2451 使能脚电阻判断

MP2451使能脚(EN)内部接一个稳压管,防止EN所接电压过大。 EN输入的电压范围:从PDF文档中找到EN的开启电压和最高电压。 Enable up Threshold 1.4-1.7 因为计算时需要考虑其极端现象,所以开启电压的临界电压选择最高,1.7v。最高…

CSM3416SF兼容MP2451,MCP16301HT-E,LT1933ES6,AOZ1282CI

CSM3416SF是一颗高耐压DC-DC降压芯片,宽电压范围输入,完美兼容MP2451,MCP16301HT-E,LT1933ES6,AOZ1282CI,助力智能电表市场,赋能车库门驱动系统。

S32K144开发笔记5 - SPI驱动MCP2515

1、接线图 PTB13 — INT 接收数据中断引脚 PTB14 — CLK 时钟 PTB15 — MISO 接收 PTB16 — MOSI 发送 PTB17 — CSN 片选 2、软件SPI 2.1、GPIO口配置 鼠标放在如下位置右击选择Pin Functional Properities,进入引脚属性配置 PTB13引脚配置如下: PT…

nRF52笔记(26)QSPI接口液晶显示屏

1 平台条件 硬件:nrf52840 软件:sdk17.0 2 QSPI概述 QSPI 外设支持使用 SPI 与外部闪存设备进行通信 此处列出了 QSPI 外设的主要特性: • 单/双/四通道 SPI 输入/输出 • 2–32 MHz 可配置时钟频率 • 从/到外部闪存的单字读/写访问 • …

MPC5744-LINFlexD

目录 一、基本介绍1.功能2.时钟源3.外设控制器4.中断向量5.基地址 二、寄存器介绍1.LIN控制寄存器1 LINFlexD_LINCR12.LIN中断使能寄存器LINFlexD_LINIER3.LIN状态寄存器LINFlexD_LINSR4.LIN错误状态寄存器LINFlexD_LINESR5.UART控制寄存器LINFlexD_UARTCR6.UART状态寄存器LINF…

MP2456的芯片的学习

本章将讲述MP2456的特征、性能、参数、应用电路、以及使用时的注意事项。小白总结,如有错误,请大神指教。 目录 一、MP2456的特征 二、MP2456的性能和参数 四、MP2456使用时的注意事项 五、名词解释 一、MP2456的特征 (1)MP…

硬件电路-MP2451组成的电压反转/极性反转电路设计

板上要集成一个18V供电的模拟信号处理电路,包括线圈驱动、小信号拾取、滤波、二级放大等部分。因此,需要板上提供18V电源。正负电压需要分开控制,因为正电压需要兼作485传感器供电,此时关闭负电压部分节省耗电以及保护模拟端。 b…

MP2451的应用电路

电阻R32和电阻R23是怎么实现的电压,FB口的输出是0.8V。 正确的计算应该是: 0.8/10*(1027)这样就是输出的电压。 SS14是大电流二极管,可以用5819完全替代。还有续流二极管。 SS14是40V的耐压,SS12是20V的耐压。 8050可以替代BC8…

MP2451问题记录

数据手册 https://pan.baidu.com/s/1ggJs0y3 MP2451应用电路如下图 在我自己的应用电路中R1120K,R224k 问题一、 电源输出0.42V V(FB)手册中应等于0.8V,但在测试中发现该引脚电压仅为0.07V 0.07 * (12024) / 24 0.42V 判断是芯片损坏 问题二、FB引脚输…

MP2451的BUCK电路

5V的稳压模块经常会用得到,普通的AMS1117-5.0虽然电压输出非常稳定,但是只适合低压降,小电流的场合。笔者曾经用AMS1117-5.0把8.4V稳压到5V,电流160mA(8.4V端),芯片一会儿就非常烫手了,即使并联…

MP2451使用注意事项

MP2451使用注意事项 MP2451是一个高速2M的高效的降压芯片,提供0.6A的电流输出,输入电压范围3.3V-36V可调,有关闭芯片引脚,关闭电流3uA,用起来还不错,分享一下经验,如下原理图已经制成了板子&am…

类间关系和内部类和数组

Final关键词 定义Pepole类,运用了final修饰方法eat(),该方法不能被改写,但可以随类进行继承。 用final修饰的类,不能有子类。 内部成员类定义方式 外部类.成员类 对象名 new 外部类().new 内部类。 局部…

UML六种关系图示(过目不忘版)

图中,从左到右分别是依赖、关联、聚合、组合、实现、继承六种关系在UML图中的画法,有箭头,有菱形,有三角,他们为什么这么画呢,之间有什么联系呢,这要从全局来看。 首先,依赖关联关系…

类图有哪些关系?

此刻是最佳时间,抓住当下!最近在学习设计模式的时候,时常要用到类图及它们的关联,所以学习了UML类图及类图之间的关系,转载记录一下。 首先我们需要知道什么是类图。 类图(ClassDiagram)是UML图…

UML中的六种关系

UML关系 1、依赖关系 是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。 在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一…

UML的六大关系

关联关系 单向关联 双向关联 自关联 聚合关系 聚合关系是关联关系的一种,是强关联关系,是整体和部分之间的关系 聚合关系通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。例如&…

部分和问题

题目来源 挑战程序设计竞赛(第二版) 语言 C/C 题目 部分和问题 描述 给定整数 a1, a2, ..., an,判断是否可以从中选出若干数,使它们的和恰好为 k。 样例1 输入: n 4 a {1, 2, 4, 7}; k 13 输出&#xff1a…

【UML】2.部分与整体的媒介:关系

UML模块中的任何事物都不是独立存在的,他们之间存在着一定的关系。下面就对这些关系,分类了解一下。 一.概念 【关联】Association 两个类存在某种语义上的联系,关联有单向关联和双向关联。 【聚合】Aggregation 类之间是整体…

干货!基于部分-整体关系的概念、关系和物理场景认知推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 人类视觉感知的一个关键方面是能够将视觉场景解析为单个对象并进一步分解为对象部分,形成部分-整体层次结构。这种复合结构可以产生丰富的语义概念和关系,从而在视觉信号的解释和组织以及…