DSP28335-SPI配置简介与应用—Demo1(无FIFO收发)和Demo2(中断收发)

发布于:2023-01-18 ⋅ 阅读:(779) ⋅ 点赞:(0)

系列文章目录

DSP28335-SPI配置简介与应用—Demo1(无FIFO收发)和Demo2(中断收发)



前言

最近在使用DSPF28335(主机)与RTC(实时时钟)芯片M41T94进行通信,通信协议采用的是SPI总线,两者之间一直不能通信成功(例如写数据(MOSI)数据乱序,读数据信号线(MISO)一直是高阻态,片选信号波形出现小跳变等),针对以上几个问题,实验过程中从以下几点去进行解决:

  • 硬件方面:检测电路连结是否正确,供电信号(VCC)、时钟信号(晶振信号)、所有信号是否共地等;
  • 软件方面:了解SPI的运行机制、DSP28335对于SPI信号的正确配置(最重要的部分)、与从机配置方式是否匹配等;
  • 验证方面:SPI接口的一个缺点是没有指定的流控制,没有应答机制确认是否接收到数据。但前期可以保障的是通过示波器解码SPI信号,确认解码的SPI时序信号是正确标准的
    下面将我解决过程所需要掌握的的一些知识和经验进行记录。

一、SPI简介与DSP28335的SPI配置

1.SPI简介

SPI(Serial Peripheral Interface) 一种高速的全双共同步串行通信总线。应用于一个主机和一个或者多个从机的模式下,因为所有具有SPI功能的设备基本都配备了MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)四根接口线。
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK– Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制
因为SPI是串行同步通信,所以需要对串行同步时钟的极性(SCLK Polarity 简称CPOL)和相位(SCLK Phase 简称CPHA)进行配置,通过对两个位的排列组合,使得SPI可以工作在四种模式,如下图所示:
在这里插入图片描述
如图片所示SPI的四种模式,(经过分析图片上部分的时序-偶数边沿采样,属于01模式),我们常使用模式00和模式11。如下图所示:
在这里插入图片描述
在这里插入图片描述
上面图片的描述主要是介绍了我们本次与RTC通信所需要到的信息,更详细的SPI简介推荐去看下面的两个视频(图片也引用于视频)
SPI总线,你真的懂它?
SPI通信协议的原理及其简单应用

2.DSP28335的SPI配置

TMS320F28335配备了SPI外设功能,但仅有一个SPIA模块供使用,要是不够用了怎么办?可以通过以下方法进行扩展:

  • 根据前文SPI简述可知该协议可以工作于一主机多从机的方式,这样DSP28335就可以与多个SPI外设模块进行通信;
  • 使用普通GPIO口模拟SPI接口SCLK时序,在上升沿的时候将输出引脚的状态改变模拟数据发送,在下降沿的时候读取输入引脚的高低电平状态以模拟数据输入,只不过发送和接受的时候速度慢一些。

a) 首先是GPIO的配置

F28335上可以复用为SPI功能接口的有以下两组(对于片选信号TI的例程给的是复用该管脚的功能,但若是该配置下导致SPI解码的的片选信号出现小跳变,可以将片选信号的配置为通用IO口进行测验):

//GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // SPISIMOA
//GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // SPISOMIA
//GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // SPICLKA
//GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // SPISTEA
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // SPISTEA

b) 相关寄存器配置

在这里插入图片描述
上图是控制SPI的所有寄存器,其中最重要的是红框标注的4个寄存器:
SPICCR: 该寄存器可以配置时钟极性(CPOL)、自循环模式、字符长度控制等
SPICTL: 控制数据发送、中断产生、SCLK相位(CPHA)、主从模式等
SPIST: 初始化之后,要进行的就是SPI数据什么时候发送完,什么时候接受完,因为只有完成了发送和接受,CPU才能做其他事情,否则时钟线就会被迫暂停,导致传输错误,所以就需要用到状态寄存器SPISTS, 该寄存器的第六位SPI INT FLAG是一个只读标志位,在完成发送最后一位和接受最后一位后都会硬件置1.但开启FIFO模式后,该标志位不会变化。从SPI的中断框图可以看出:
在这里插入图片描述
SPIBRR: 波特率分频寄存器
LSPCLK/(SPIBRR+1) 3=<SPIBRR<=127
LSPCLK/4 0=<SPIBRR<3

在配置SPI寄存器的时候需要软件复位配置前清零,恢复操作时置1。(清零时,SPIST 5,6,7被清楚,SPI配置不变)
配置SPI时:

  1. SPI SW RESET=0;
  2. 配置SPI;
  3. SPI SW RESET=1.

测试验证

与SPI外设的接口进行通信交互的时候,如前文第一部分所述,当与SPI外设模块不能通信时,首先确保处理器对SPI的配置正确,使用示波器解码SPI的串行信号,确保时序正确。我在配置的时候SPI时序信号如图一所示:
在这里插入图片描述
虽然示波器解码的数值与我发送的数值相一致,但是中间每个数据间片选信号都会有一个小跳变,这是不符合时钟芯片手册的时序波形的如下图所示
在这里插入图片描述
为此我们将片选信号的复用功能去掉,改为通用IO口的功能,便实现成功将数据写入时钟模块当中(之前存在跳变的时候是不能正常运行的)。

代码示例与总结

无(FIFO)和FIFO中断收发传输主要是对寄存器配置,本文重点是对与外接RTC芯片的测试,代码不做重点说明。