TMS320F280X SPI SPIA使用入门与总结
我使用过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使用入门与总结相关推荐
- 【51单片机快速入门指南】5.3:SPI控制晶联讯JLX12864G_08602 LCD屏幕
目录 示例程序 JLX12864G_08602.c JLX12864G_08602.h JLX12864G_08602_Font.c JLX12864G_08602_Font.h 测试程序 main. ...
- 【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片
目录 硬知识 DS1302 简介 DS1302 使用 控制寄存器 日历/时钟寄存器 DS1302 的读写时序 电路设计 示例程序 DS1302.c DS1302.h 测试程序 main.c 实验现象 ...
- 【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制
目录 硬知识 IO 口扩展方式-串转并 74HC595 芯片介绍 硬件设计 测试源码 HC74595.c HC74595.h main.h 实验现象 SPI控制 普中51-单核-A2 STC89C52 ...
- android spi串口调试,PIC入门3,SPI通信和串口调试实验
原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...
- FPGA基础入门【8】开发板外部存储器SPI flash访问
前两篇教程利用数码管project介绍了chipscope和各种烧写开发板的方式,这篇开始继续探索开发板,这次关注外置存储器的控制,外置指的是芯片外部,不是开发板外部.板子上的外置存储器有DDR2和S ...
- 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.选择屏 ...
- 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信
张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信 什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设 ...
- Dubbo点滴(1) SPI入门
spi(service providerinterface),是DUBBO功能强大的保障.核心支持类ExtensionLoader. 具体分析可以参照<Dubbo原理解析-Dubbo内核实现之基 ...
- Flink从入门到精通100篇(十一)-Java SPI 机制在 Flink SQL 中的应用
Java SPI 机制简介 Java SPI机制,即Java Service Provider Interface,是Java提供的基于"接口编程 + 策略模式 + 配置文件"组合 ...
最新文章
- C++ 中隐藏DOS调用的命令行窗口
- python的x 2是什么意思_python中startx是什么意思
- 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis
- Android内存泄露总结
- linux 压缩解压打包
- SharePoint Search之(七)Search result- 结果源
- 考试系统试题实现(单选项)
- 为什么jdk中把String类设计成final
- 关闭虚拟机linux的防火墙,Linux虚拟机SSH服务、防火墙开启关闭
- 「总结」 MLEAutoMaton的各种板子总结
- 1 linux中解决文件已rm删除但空间不释放的案例
- 《转》牛顿法与拟牛顿法学习笔记
- 关于ip报文校验和一些思考
- mysql导入错误1148,将CSV导入MySQL表会返回错误#1148
- 国际知名财务和ERP软件系统
- 闻与MyBatis之MyBatis快速指南
- IDEA执行hadoop相关报错xxx from xxx is not a valid DFS filename.
- 破解 WiFi,获取 WiFi 密码
- 【无标题】刘易远:做事必须要脚踏实地
- 微信转发(分享)功能
热门文章
- 假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
- RocketMQ常用命令使用示例及说明
- 常见的DOM操作有哪些
- keil MDK 调试运行中程序
- 改变ListBox中文本的颜色以及其他
- 泰拉瑞亚服务器config修改,泰拉瑞亚配置修改方法详解 泰拉瑞亚怎么修改游戏配置 Config文件格式-游侠网...
- Jmeter参数化请求
- 在中欧重压下,苹果将采用Type-C接口,不过贪婪的它玩了小花招
- 谈一下SnowNLP的情感分析
- UG NX二次开发(C#)-曲线-创建样条曲线的几种方法