星期三, 7月 07, 2004

Some Notes about SPI

SPI的TX和RX是同時動作的,CLK是拿來作二者同步的依據。

也就是說,當使用3 wire (SDI/SDO/SCK)的連線時。
Master端(CLK Generator)在送出一個byte的資料時,
Slave也可同時藉由這個CLK將信號送出。
所以Master在送出資料後,同時自己也收到Slave送來的資料。

從另一方面來看,
當Master要向Slave讀取資料時,也要藉由”送出資料”的方式,
讓SCK有CLK產生,好讓Slave取得資料。

所以一般來說,Master/Slave對於資料(command)的內容,
是採用 自行決定 的方式。

例如:
Write Command : 0x01, Data1, Data2
Read Command : 0x80, Data1, Data2

由於Master要對TXBUF作寫入動作,SCK才會有CLK輸出。
所以不論是Write還是Read,Master要對TX作兩次寫入動作。
只不過在作Read時,第二個Byte的資料會被Slave端忽略。

Slave端要實作一個State Machine,紀錄是否收到過Read Command,或是已經傳送的部分。
如果上次收到了Read Command (0x80),或是還沒傳送完,在收到TX command時,要忽略Master
送來的data,繼續作Rely的動作。

Slave 的Interrupt Code:


void spiint(void)
{
static int readcmd=0;
static int rplyi=0;
char dummy;
if(readcmd) {
dummy=RXBUF; // 讀入RXBUF,但是沒有用,因為是Master送的dummy command
TXBUF=RplyData[rplyi++];
if(rplyi>=2) {
rplyi=readcmd=0;
}
}else{
if(RXBUF==0x80) {
readcmd=1;
TXBUF=RplyData[rplyi++];
}else{
作收的部分..
}
}

沒有留言:

網誌存檔