376硬件SPI讀寫數(shù)據(jù)

在使用硬件SPI時(shí),例程里的Spi376Exchange( UINT8 d )能實(shí)現(xiàn)輸出且輸入8個(gè)位數(shù)據(jù)嗎? UINT8 Spi376Exchange( UINT8 d ) /* 硬件SPI輸出且輸入8個(gè)位數(shù)據(jù) */ { /* 為了提高速度,可以將該子程序做成宏以減少子程序調(diào)用層次 */ SPDR = d; /* 先將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器,然后查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ while ( ( SPSR & SPI_IF_TRANS ) == 0 ); /* 查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ SPSR &= ~ SPI_IF_TRANS; /* 清除SPI字節(jié)傳輸完成標(biāo)志,有的單片機(jī)會(huì)自動(dòng)清除 */ return( SPDR ); /* 先查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成,然后從SPI數(shù)據(jù)寄存器讀出數(shù)據(jù) */ }

我感覺此程序只能輸出8個(gè)位數(shù)據(jù)吧?

void xWriteCH376Data( UINT8 mData ) /* 向CH376寫數(shù)據(jù) */ { Spi376Exchange( mData ); // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ } UINT8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ return( Spi376Exchange( 0xFF ) ); }

從376讀數(shù)據(jù)時(shí),為什么形參要帶0xff,這樣能對(duì)寫入的數(shù)據(jù)取反嗎?請多指教

補(bǔ)充: 我的mcu接收和發(fā)送字節(jié)的狀態(tài)是兩個(gè)標(biāo)志位RX_BYTE和TX_BYTE,所以開始我改成如下:

RX_BYTE 接收字節(jié)狀態(tài)。UART模式和SPI從模式 0:沒有接收字節(jié) 1:收到的字節(jié)就緒 TX_BYTE 發(fā)送字節(jié)狀態(tài)。UART模式和SPI主模式 0:沒有發(fā)送字節(jié) 1:寫到數(shù)據(jù)緩沖器寄存器的最后字節(jié)已發(fā)送

UINT8 Spi376Exchange( UINT8 d ) /* 硬件SPI輸出且輸入8個(gè)位數(shù)據(jù) */ { /* 為了提高速度,可以將該子程序做成宏以減少子程序調(diào)用層次 */ //SPDR = d; /* 先將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器,然后查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ //while ( ( SPSR & SPI_IF_TRANS ) == 0 ); /* 查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ //SPSR &= ~ SPI_IF_TRANS; /* 清除SPI字節(jié)傳輸完成標(biāo)志,有的單片機(jī)會(huì)自動(dòng)清除 */ //return( SPDR ); /* 先查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成,然后從SPI數(shù)據(jù)寄存器讀出數(shù)據(jù) */

CH376_SPI_SCS = 0; U1DBUF = d; //加入要發(fā)送的數(shù)據(jù) while (!U1TX_BYTE); //讀取接收狀態(tài) CH376_SPI_SCS = 1; U1TX_BYTE = 0; return(U1DBUF); } 我感覺這樣只能向376寫數(shù)據(jù),不能讀數(shù)據(jù),跑程序證明SPI通訊不正常,就參照模擬spi的方式,把寫和讀分成兩個(gè)函數(shù),如下

void Spi376OutByte( UINT8 d ) /* SPI輸出8個(gè)位數(shù)據(jù) */ { P1SEL |= 0xE0; // P1_7, P1_6, and P1_5 are peripherals P1SEL &= ~0x10; // P1_4 is GPIO (SSN) P1DIR |= 0x10; // SSN is set as output U1CSR &= ~0xA0; // SPI Master Mode CH376_SPI_SCS = 0; U1DBUF = d; //將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器 while(!U1TX_BYTE); //查詢接收字節(jié)的狀態(tài) U1TX_BYTE = 0; //清除SPI字節(jié)傳輸完成標(biāo)志 CH376_SPI_SCS = 1; // CH376在時(shí)鐘上升沿采樣輸入 }

UINT8 Spi376InByte( void ) /* SPI輸入8個(gè)位數(shù)據(jù) */ { UINT8 d; P1SEL |= 0xF0; // P1_4, P1_5, P1_6, and P1_7 are peripherals

U1CSR &= ~0x80; U1CSR |= 0x20; // SPI Slave Mode

while(!U1RX_BYTE); U1RX_BYTE = 0; d = U1DBUF; return( d ); }

端口初始化程序如下:

void CH376_PORT_INIT( void ) /* 由于使用SPI讀寫時(shí)序,所以進(jìn)行初始化 */ { CH376_SPI_SCS = 1; //INTT PERCFG |= 0x02; // PERCFG.U1CFG = 1 P1SEL &= ~0x10; // P1_4 is GPIO (SSN) P1DIR |= 0x10; // SSN is set as output //Baud Rate set U1BAUD = 0x00; // BAUD_M = 0 U1GCR |= 0x11; // BAUD_E = 17 Fsck=(((256+BAUD_m)*2^BAUD_E)/2^28)*32M=4M // Configure phase, polarity, and bit order U1GCR &= ~0xC0; // CPOL = CPHA = 0 U1GCR |= 0x20; // ORDER = 1 MSB先傳輸 }

幫忙給看看這樣給行嗎?有沒有問題?


這跟SPI底層有關(guān)系,Spi376Exchange函數(shù)既可以輸入也可以輸出數(shù)據(jù),數(shù)據(jù)是循環(huán)發(fā)送的,發(fā)送一組數(shù)據(jù)數(shù)為了產(chǎn)生8位時(shí)鐘來輸入輸出數(shù)據(jù),就讀而言,產(chǎn)生時(shí)鐘后讀到覆蓋SPDR的數(shù)據(jù)。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频