求助 ATmega128 讀寫(xiě)CH376s時(shí)SPI通信問(wèn)題

void spi_init()
{??
??? uchar temp;
??? DDRB|=0x07;//PB0,1,2=1,輸出
?PORTB|=BIT(2);//PB3打開(kāi)上垃電阻
?//PORTB|=0x03;//禁止SPI片選,設(shè)置SCS默認(rèn)高電平
?SPCR=0x5C;//使能SPI,主機(jī)模式
?SPSR=0x00;//倍速模式
? temp = SPSR;
? temp = SPDR;//清空SPI,和中斷標(biāo)志,使SPI空閑?
?
?delay_ms(100);


?DDRB|=BIT(4);
?PORTB|=BIT(4);
?delay_ms(100);
?PORTB&=~BIT(4);
?delay_ms(100);
}


??????????????????????????????????????????????????????????????
UINT8?mInitCH376Host( void )?????????????? /* 初始化CH376 */
{
?UINT8?res;
?spi_init();????????????????? /* 接口硬件初始化 */
??????? //xWriteCH376Cmd(0x05);
?xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測(cè)試單片機(jī)與CH376之間的通訊接口*/???????????????????
?xWriteCH376Data( 0x55 );???
??????? //xReadCH376Data();?????????
??????? res = xReadCH376Data();?????
?xEndCH376Cmd();
?if ( res != 0xAA )? return( ERR_USB_UNKNOWN ); /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */
?//else
??????? //{
??????? xWriteCH376Cmd( CMD11_SET_USB_MODE );???????? /* 設(shè)備USB工作模式 */
??????? delay_ms(10);
?xWriteCH376Data( 0x06 );
?
??????? res =xReadCH376Data();
?xEndCH376Cmd();
??????
?if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );
?else return( ERR_USB_UNKNOWN );?????????????? /* 設(shè)置模式錯(cuò)誤 */
??????? //}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void?mStopIfError( UINT8 iError )
{
?if ( iError == USB_INT_SUCCESS ) return;? /* 操作成功 */
?while ( 1 ) {
??delay_ms( 200 );
??delay_ms( 200 );??????????????
?}
}



//向376讀寫(xiě)數(shù)據(jù)
unsigned char Spi376dataExchange( UINT8 M_Data)???????????? /* 硬件SPI輸出且輸入8個(gè)位數(shù)據(jù) */
{????????
????????????????????????????????????????
???????? SPDR = M_Data;???????????????????? /* 啟動(dòng)數(shù)據(jù)傳輸 */???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //傳輸?shù)谝粋€(gè)數(shù)據(jù)啟動(dòng)時(shí)鐘輸出
???????? while(!(SPSR & (1<??? return(SPDR);????????????????
}
void?xWriteCH376Data( UINT8 mData )???????? /* 向CH376寫(xiě)數(shù)據(jù) */
{
?????
?Spi376dataExchange( mData );
?????? ?delay_ms(10);?????????????????????????
}


UINT8? xReadCH376Data()
{
?????
????? delay_ms(10);
????? return(Spi376dataExchange(0xff));
?????
}


void?xEndCH376Cmd(void)
{??
????
?????? //DDRB|=BIT(0);
??? PORTB|=BIT(0);
????? delay_ms(10);
}
//寫(xiě)命令
void?xWriteCH376Cmd( UINT8 mCmd )???????? /* 向CH376寫(xiě)命令 */
{?????????
?
?????? //DDRB|=BIT(0);
?????? PORTB|=BIT(0);???????????????????? /* 禁止SPI片選 CS*/
??????? delay_ms(10);
??????? //P2OUT &=0xef;??????????????????????? /* SPI片選有效 */
??? PORTB&=~BIT(0);
??????? delay_ms(10);
??????? Spi376dataExchange( mCmd );???????????????? /* 發(fā)出命令碼 */
??? delay_ms(10);???????????????????????? /* 延時(shí)1.5uS確保讀寫(xiě)周期大于1.5uS,或者用上面一行的狀態(tài)查詢代替 */
???????
}
UINT8?Query376Interrupt( void )
{??????
?????? DDRB&=~BIT(5);?????? //PB5作為int#使用
?????? if (!(PINB5&0x10))???? //? 檢測(cè)輸入端口是否有低電平?
??????? return(TRUE );
????? else
??????? return(FALSE);
}

以上是本人的SPI初始化以及376初始化部分程序,每次SPI發(fā)送測(cè)試命令時(shí)都讀取不到返回值,正常情況應(yīng)該有0XAA,但是從SPI的數(shù)據(jù)寄存器SPDR沒(méi)有返回值,請(qǐng)問(wèn)這是什么情況


首先,排除硬件的問(wèn)題,晶振是否起振,SPI模式的話WR#、RD#接地,復(fù)位輸出(25腳)是否為低電平。軟件上,就是時(shí)序的問(wèn)題,用示波器看一下你發(fā)過(guò)去的波形是否正確。


我直接買的是江蘇沁恒公司的CH376S模塊,芯片什么的都是焊好的,按照網(wǎng)上的說(shuō)法測(cè)了一下晶振,應(yīng)該是起振的,綠色的指示燈也亮了,硬件應(yīng)該沒(méi)什么問(wèn)題吧,那有可能是軟件的問(wèn)題了,可是一直沒(méi)找到,郁悶啊


最好測(cè)量一下WR#、RD#、RST腳的電平。軟件的話對(duì)照我們提供的51單片機(jī)的例子,讀寫(xiě)函數(shù)之間的延時(shí)1~2us就夠了。


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

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