發新話題
打印

SPI 的問題

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 >

TOP

發新話題