|
SSD1351的設(shè)置,是:
時(shí)鐘 空閑保持高電平。第二個(gè)時(shí)鐘邊沿?cái)?shù)據(jù)采樣捕獲,第一時(shí)鐘邊沿鎖存
SCLK的空閑無(wú)效狀態(tài)是高電平 (其實(shí)也可以是低電平,但相位就要改改了,變?yōu)榈诙䝼(gè)時(shí)鐘邊沿鎖存,,第一時(shí)鐘邊沿?cái)?shù)據(jù)采樣捕獲)
數(shù)據(jù)的MSB 先發(fā)送。
好了,看看我是如何范這些毛病的,
void Write_Data(unsigned char Data)
void Write_Command(unsigned char Data)
看出參數(shù)都是8位的數(shù)據(jù),比如要發(fā)送Data=0x55;那么傳輸?shù)紻SP 的SPI寄存器里這就出問題了!
是吧? 因?yàn)槭荕SB先發(fā)送,這樣0x55到了16位的SPI寄存器例如SpiaRegs.SPITXBUF或
SpiaRegs.SPIDAT 就變?yōu)?x0055了,由于SPIA 設(shè)置位8位模式,而且是MSB 先發(fā)送。
那么就是只發(fā)送 0x0055的 00(高8位)了,低8位55就沒有發(fā)送了。
因此 發(fā)送前要做如下變換:
Uint16 tmp;
tmp=Data;
tmp<<=8;
。。。。
SpiaRegs.SPIDAT =tmp
而接收時(shí)無(wú)需移位,SpiaRegs.SPIDAT、SpiaRegs.SPIRXBUF中低8位就是發(fā)送的tmp
SPIA的數(shù)據(jù)寬度設(shè)為8位。
SpiaRegs.SPICCR.bit.SPICHAR=7;
這個(gè)其實(shí)很簡(jiǎn)單,看看手冊(cè)就知道了,不過我在網(wǎng)上看的HOTPOWER有關(guān)C54X的SPI設(shè)置。
就把SpiaRegs.SPICCR.bit.SPICHAR=8;來(lái)設(shè)8位的,這點(diǎn)我認(rèn)為是不對(duì)了,雖然我不了解C54的SPI設(shè)置。
但估計(jì)也與C28X是一樣的吧?哈哈!看來(lái)HOTPOWER也會(huì)范這樣的低級(jí)毛病?不會(huì)吧?
時(shí)鐘極性與時(shí)鐘相位,其實(shí)我的OLED要求的是
【時(shí)鐘 空閑保持高電平。第二個(gè)時(shí)鐘邊沿?cái)?shù)據(jù)采樣捕獲,第一時(shí)鐘邊沿鎖存,SCLK的空閑無(wú)效狀態(tài)是高電平】
這個(gè)我想當(dāng)然的搞錯(cuò)了:
SpiaRegs.SPICCR.bit.CLKPOLARITY=1; // 空閑時(shí)是高電平 這是對(duì)的
SpiaRegs.SPICTL.bit.CLK_PHASE=1;//
這個(gè)是錯(cuò)的!**
后來(lái)我認(rèn)真看看了TI C28X SPI的數(shù)據(jù)手冊(cè),這個(gè)大家一定要好好看看!
這個(gè)圖就是數(shù)據(jù)在時(shí)鐘下跳沿改變、鎖存,在時(shí)鐘上升沿被捕獲采樣。
如果不明白可以看看我的《精解 SPI 的
CPHA 時(shí)鐘相位 與CPLK 時(shí)鐘極性》
正確如下:
SpiaRegs.SPICCR.bit.CLKPOLARITY=1; // 空閑時(shí)是高電平 這是對(duì)的
SpiaRegs.SPICTL.bit.CLK_PHASE=0;//
SPIA的發(fā)送與接收是【同時(shí)】進(jìn)行的概念
SPIA數(shù)據(jù)發(fā)送移位寄存器SpiaRegs.SPIDAT 是先發(fā)送MSB位,也就是BIT15位移位出SIMO,
同時(shí)從SOMI采樣一位數(shù)據(jù)到LSB 也就是BIT0。如此類推
BIT14移位到BIT15,然后發(fā)送到SIMO
BIT0移位到BIT1,然后從SOMI移入一位數(shù)據(jù)到BIT0……..
這個(gè)過程發(fā)送到SIMO和接收SOMI是同時(shí)進(jìn)行的。
因此發(fā)生到底完成沒有,可以查看接收到完整的8位數(shù)據(jù)沒有。不過數(shù)據(jù)線怎樣,只要有MSB移除SIMO就有數(shù)據(jù)從SOMI移入BIT0,哪怕全是0或全是1.
都有點(diǎn)不同的是,C28X SPI手冊(cè)上說(shuō)當(dāng)數(shù)據(jù)接收完畢的SpiaRegs.SPIDAT,就好把SpiaRegs.SPIDAT的數(shù)據(jù)
輸入到SpiaRegs.RXBUF的RX FIFO中,并置位SpiaRegs.SPISTS.bit.INT_FLAG.
這點(diǎn),我認(rèn)為TI的數(shù)據(jù)手冊(cè)在忽悠我們。 真實(shí)情況是非的要關(guān)閉FIFO增強(qiáng)才會(huì)出現(xiàn)這個(gè)情況。
就是SpiaRegs.SPIFFTX.bit.SPIFFENA=0;
這樣我們要查詢到的數(shù)據(jù)發(fā)送完畢沒有,只有等到SpiaRegs.SPISTS.bit.INT_FLAG[local]1[/local]置位就可以了。
哎,有點(diǎn)晚了,明天還要上班啦~,大家請(qǐng)?jiān)徳谙铝耍?br />
其實(shí)有決心寫這個(gè)全是因?yàn)楫?dāng)時(shí)出了問題比較著急,但在網(wǎng)上GOOGLE卻沒有什么收獲!真讓人氣憤!
全大陸這么多大學(xué)的YY,GG ,不是很會(huì)出啥書啥書的嗎?汗!
真是希望大家從這文中有點(diǎn)收獲~,不要再被C28X的SPI折騰和TI文檔的折騰了~!哈哈。
希望TI別見怪啦~! |
|