|

楼主 |
发表于 2009-9-1 08:55:47
|
显示全部楼层
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.SPISTS.bit.INT_FLAG[local]1[/local]置位就可以了。
哎,有点晚了,明天还要上班啦~,大家请原谅在下了,
其实有决心写这个全是因为当时出了问题比较着急,但在网上GOOGLE却没有什么收获!真让人气愤!
全大陆这么多大学的YY,GG ,不是很会出啥书啥书的吗?汗!
真是希望大家从这文中有点收获~,不要再被C28X的SPI折腾和TI文档的折腾了~!哈哈。
希望TI别见怪啦~! |
|