|
沙發
樓主 |
發表于 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別見怪啦~! |
|