我使用过NXP ARM LPC2138的SPI口,ATMEL AT91SAM7S256的SPI,MSP430F5438的SPI口,
还有STM32 的SPI模块。都是用来读 SPI FLASH 例如 AT45DB642D之类。

本以为对SPI已经入门了, 谁不知使用TMS320F280X的SPI后,才知道自己其实还是一知半解。
TMS320F280X 的SPI 真是好好给我上了一课!

不久前有款 OLED 真彩色液晶。使用的是SSD1351控制器,SPI接口。 想测试一下它的速度。就把它接到我的
TMS320F280X的DSP 开发板上。之前使用DSP的IO模拟,运行程序后OLED的效果不错的。
本想这次使用SPI应该没事吧『虽然I/O模拟也是使用这个SPI的引进』?

新建立一个工程 MYOLED, 拷贝一些TMS320F28X相关的头文件,C文件。把工程的设置好后,编译OK!
加上定时器中断用来点亮一个LED,把I/O模拟的工程相关文件的两个子函数改为SPI方式的。
在编译。文件太大非得使用FLASH下载仿真。

发现程序不能运行! 没办法改回RAM仿真,把很多函数注释掉。仅仅留下测试OLED的程序。
SSD1351的测试程序,向它写某命令码,可以改变GPIO1/GPIO2引脚的电平。
其实移植就是仅仅这两个SPI底层函数:
void Write_Data(unsigned char Data)
void Write_Command(unsigned char Data)

测试好几次都没反应,  因此 就有下面的入门与详解了。

使用的是SPIA模块,如果SPIB没有什么特别(功能设置与SPIA差不多的话)也是没什么问题的。
但是我之前使用SPIB测试过,发觉SPIB还是与SPIA有区别的。这点我也很不解~。
按道理应该不会这样。但事实却是如此.

TMS320F280X的SPI 支持1-16位的数据类型。
而且 只有MSB先发送,不像ARM7/STM32等可以设MSB或LSB先发送。
TMS320F280X的SPI有回环模式, 可以用于测试,自发自收。
TMS320F280X的SPI有TX FIFO和RX FIFO. 及其中断字节设置。

看来没什么特别? 是吧~?  先别小看啊~,就是搞不定它呢!

首先是要回环模式,这样就是一个自发自收,方便测试。

其实现在看来,我曾经范了几点毛病。

1.
使用8位模式,但SPIA的总线,发送接收等寄存器都是16位模式。
2.
数据的位数设置不对
3.
时钟极性与时钟相位。
4.
使用了 TX FIFO与RX FIFO.
其实不用使用FIFO比较好。为什么?下面会讲。
5.
没有完全理解SPIA的发送与接收是【同时】进行的概念,这点实在很惭愧!
6.
发送是MSB对齐先发送,接收是LSB对齐接收,发送与接收是【同时】进行的!

SSD1351的设置,是:
时钟 空闲保持高电平。第二个时钟边沿数据采样捕获,第一时钟边沿锁存

SCLK的空闲无效状态是高电平 (其实也可以是低电平,但相位就要改改了,变为第二个时钟边沿锁存,,第一时钟边沿数据采样捕获)
数据的MSB 先发送。

好了,看看我是如何范这些毛病的,
void Write_Data(unsigned char Data)
void Write_Command(unsigned char Data)

看出参数都是8位的数据,比如要发送Data=0x55;那么传输到DSP 的SPI寄存器里这就出问题了!
是吧? 因为是MSB先发送,这样0x55到了16位的SPI寄存器例如SpiaRegs.SPITXBUF或

SpiaRegs.SPIDAT 就变为0x0055了,由于SPIA 设置位8位模式,而且是MSB 先发送。
那么就是只发送 0x0055的 00(高8位)了,低8位55就没有发送了。

因此 发送前要做如下变换:

Uint16 tmp;

tmp=Data;

tmp<<=8;

。。。。

SpiaRegs.SPIDAT =tmp

而接收时无需移位,SpiaRegs.SPIDAT、SpiaRegs.SPIRXBUF中低8位就是发送的tmp

SPIA的数据宽度设为8位。

SpiaRegs.SPICCR.bit.SPICHAR=7;
       这个其实很简单,看看手册就知道了,不过我在网上看的HOTPOWER有关C54X的SPI设置。
       就把SpiaRegs.SPICCR.bit.SPICHAR=8;来设8位的,这点我认为是不对了,虽然我不了解C54的SPI设置。
       但估计也与C28X是一样的吧?哈哈!看来HOTPOWER也会范这样的低级毛病?不会吧?
      
时钟极性与时钟相位,其实我的OLED要求的是      
【时钟 空闲保持高电平。第二个时钟边沿数据采样捕获,第一时钟边沿锁存,SCLK的空闲无效状态是高电平】     
这个我想当然的搞错了:

SpiaRegs.SPICCR.bit.CLKPOLARITY=1; // 空闲时是高电平 这是对的

SpiaRegs.SPICTL.bit.CLK_PHASE=1;//
这个是错的!**

后来我认真看看了TI C28X SPI的数据手册,这个大家一定要好好看看啊!

这个图就是数据在时钟下跳沿改变、锁存,在时钟上升沿被捕获采样。

如果不明白可以看看我的《精解 SPI 的
CPHA 时钟相位 与CPLK 时钟极性》
正确如下:

SpiaRegs.SPICCR.bit.CLKPOLARITY=1; // 空闲时是高电平 这是对的

SpiaRegs.SPICTL.bit.CLK_PHASE=0;//

SPIA的发送与接收是【同时】进行的概念
SPIA数据发送移位寄存器SpiaRegs.SPIDAT 是先发送MSB位,也就是BIT15位移位出SIMO,
同时从SOMI采样一位数据到LSB 也就是BIT0。如此类推
BIT14移位到BIT15,然后发送到SIMO
BIT0移位到BIT1,然后从SOMI移入一位数据到BIT0……..

这个过程发送到SIMO和接收SOMI是同时进行的。
因此发生到底完成没有,可以查看接收到完整的8位数据没有。不过数据线怎样,只要有MSB移除SIMO就有数据从SOMI移入BIT0,哪怕全是0或全是1.

都有点不同的是,C28X SPI手册上说当数据接收完毕的SpiaRegs.SPIDAT,就好把SpiaRegs.SPIDAT的数据
输入到SpiaRegs.RXBUF的RX FIFO中,并置位SpiaRegs.SPISTS.bit.INT_FLAG.
这点,我认为TI的数据手册在忽悠我们。 真实情况是非的要关闭FIFO增强才会出现这个情况。
就是SpiaRegs.SPIFFTX.bit.SPIFFENA=0;
这样我们要查询到的数据发送完毕没有,只有等到SpiaRegs.SPIFFTX.bit.SPIFFENA置位就可以了。

哎,有点晚了,明天还要上班啦~,大家请原谅在下了,

其实有决心写这个全是因为当时出了问题比较着急,但在网上GOOGLE却没有什么收获!真让人气愤!
全大陆这么多大学的YY,GG ,不是很会出啥书啥书的吗?汗!
      真是希望大家从这文中有点收获~,不要再被C28X的SPI折腾和TI文档的折腾了~!哈哈。
希望TI别见怪啦~!

原文地址:http://bbs.21ic.com/icview-132026-1-1.html

TMS320F280X SPI SPIA使用入门与总结相关推荐

  1. 【51单片机快速入门指南】5.3:SPI控制晶联讯JLX12864G_08602 LCD屏幕

    目录 示例程序 JLX12864G_08602.c JLX12864G_08602.h JLX12864G_08602_Font.c JLX12864G_08602_Font.h 测试程序 main. ...

  2. 【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片

    目录 硬知识 DS1302 简介 DS1302 使用 控制寄存器 日历/时钟寄存器 DS1302 的读写时序 电路设计 示例程序 DS1302.c DS1302.h 测试程序 main.c 实验现象 ...

  3. 【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制

    目录 硬知识 IO 口扩展方式-串转并 74HC595 芯片介绍 硬件设计 测试源码 HC74595.c HC74595.h main.h 实验现象 SPI控制 普中51-单核-A2 STC89C52 ...

  4. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  5. FPGA基础入门【8】开发板外部存储器SPI flash访问

    前两篇教程利用数码管project介绍了chipscope和各种烧写开发板的方式,这篇开始继续探索开发板,这次关注外置存储器的控制,外置指的是芯片外部,不是开发板外部.板子上的外置存储器有DDR2和S ...

  6. ESP32 入门笔记08:1.54寸(240*240)彩色TFT 显示高清IPS LCD 屏幕 SPI接口

    目录 1.屏幕规格 2.原理图 3.程序实现 3.1引脚定义 3.2Adafruit_GFX / Arduino_ST7789版 3.3TFT_eSPI库版 3.3.1配置TFT_eSPI a.选择屏 ...

  7. 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信

    张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信 什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设 ...

  8. Dubbo点滴(1) SPI入门

    spi(service providerinterface),是DUBBO功能强大的保障.核心支持类ExtensionLoader. 具体分析可以参照<Dubbo原理解析-Dubbo内核实现之基 ...

  9. Flink从入门到精通100篇(十一)-Java SPI 机制在 Flink SQL 中的应用

    Java SPI 机制简介 Java SPI机制,即Java Service Provider Interface,是Java提供的基于"接口编程 + 策略模式 + 配置文件"组合 ...

最新文章

  1. C++ 中隐藏DOS调用的命令行窗口
  2. python的x 2是什么意思_python中startx是什么意思
  3. 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis
  4. Android内存泄露总结
  5. linux 压缩解压打包
  6. SharePoint Search之(七)Search result- 结果源
  7. 考试系统试题实现(单选项)
  8. 为什么jdk中把String类设计成final
  9. 关闭虚拟机linux的防火墙,Linux虚拟机SSH服务、防火墙开启关闭
  10. 「总结」 MLEAutoMaton的各种板子总结
  11. 1 linux中解决文件已rm删除但空间不释放的案例
  12. 《转》牛顿法与拟牛顿法学习笔记
  13. 关于ip报文校验和一些思考
  14. mysql导入错误1148,将CSV导入MySQL表会返回错误#1148
  15. 国际知名财务和ERP软件系统
  16. 闻与MyBatis之MyBatis快速指南
  17. IDEA执行hadoop相关报错xxx from xxx is not a valid DFS filename.
  18. 破解 WiFi,获取 WiFi 密码
  19. 【无标题】刘易远:做事必须要脚踏实地
  20. 微信转发(分享)功能

热门文章

  1. 假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
  2. RocketMQ常用命令使用示例及说明
  3. 常见的DOM操作有哪些
  4. keil MDK 调试运行中程序
  5. 改变ListBox中文本的颜色以及其他
  6. 泰拉瑞亚服务器config修改,泰拉瑞亚配置修改方法详解 泰拉瑞亚怎么修改游戏配置 Config文件格式-游侠网...
  7. Jmeter参数化请求
  8. 在中欧重压下,苹果将采用Type-C接口,不过贪婪的它玩了小花招
  9. 谈一下SnowNLP的情感分析
  10. UG NX二次开发(C#)-曲线-创建样条曲线的几种方法