SPI 的問題
by TroyLee
有什麼可能性我的 SPI0DAT 讀出來都是 0x00 呢?
我的設定如下:
void SPI_Init()
{
SPI0CFG = 0x70; // Master Mode, Second Edge, Clock Idle High
SPI0CN = 0x09; // Single Master, SPI Enable
SPI0CKR = 0x0C; // About 1MHz output
}
unsigned char spi_transfer_byte(unsigned char data_out)
{
// Data store from SPI0DAT
unsigned char data_in;
while( !TXBMT );
SPI0DAT = data_out;
while( (SPI0CFG&0x80) );
data_in = SPI0DAT;
// Return to callee
return data_in;
}
sbit SlaveSelect = P0 ^ 6;
unsigned char HAAM372s_ReadReg(unsigned char addr)
{
unsigned char data_in;
SlaveSelect = 0;
delay(1);
spi_transfer_byte(0x80 | addr);
data_in = spi_transfer_byte(0x00);
SlaveSelect = 1;
return data_in;
}
我的 spi_transfer_byte 應該沒有寫錯吧 @@
找到原因了,
原來是在 Configuration 2 Wizard 選好 SPI 介面之後
另外要去把 I/O Pin 腳的 Push-Pull 選起來,
不然就是要另外接 Pull-Up Resistor.
然後把 spi_transfer_byte 的方式改成檢查 SPIF 這個 Flag 比較準.
unsigned char spi_transfer_byte(unsigned char data_out)
{
// Data store from SPI0DAT
unsigned char data_in = 0x00;
SPI0DAT = data_out;
while( !SPIF );
SPIF = 0;
data_in = SPI0DAT;
// Return to callee
return data_in;
}
再來就是 Slave Select 的 NSS 腳可以透過
在SPI_Init 把 NSSMD1 設定成 1,
利用 NSSMD0 去控制 NSS 這個腳.
喔耶!
< from Morrihan Silicon Labs 產品討論區舊版 2009/3/5 >