|
#include "CH376.h"
/*******************************************************************************
* 函 數(shù) 名 : CH376_PORT_INIT
* 描 述 : 由于使用軟件模擬SPI讀寫時(shí)序,所以進(jìn)行初始化.
* 如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或
* mode0(CPOL=0&CPHA=0),CH376在時(shí)鐘上升沿采樣輸入,下降沿輸出,數(shù)
* 據(jù)位是高位在前.
*******************************************************************************/
void CH376_PORT_INIT(void){ //CH376的SPI接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO的初始化枚舉結(jié)構(gòu)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //選擇端口號
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //選擇IO接口工作方式 //上拉電阻
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(CH376_INTPORT,CH376_INT); //中斷輸入腳拉高電平
GPIO_SetBits(SPI2PORT,SPI2_NSS); //片選接口接高電平
}
/*******************************************************************************
* 函 數(shù) 名 : xEndCH376Cmd 結(jié)束命令.
*******************************************************************************/
void xEndCH376Cmd(void){ //結(jié)束命令
GPIO_SetBits(SPI2PORT,SPI2_NSS); //SPI片選無效,結(jié)束CH376命令
}
/*******************************************************************************
SPI輸出8個(gè)位數(shù)據(jù). * 發(fā)送: u8 d:要發(fā)送的數(shù)據(jù).
*******************************************************************************/
void Spi376OutByte(u8 d){ //SPI發(fā)送一個(gè)字節(jié)數(shù)據(jù)
SPI2_SendByte(d);
}
/*******************************************************************************
* 描 述 : SPI接收8個(gè)位數(shù)據(jù). u8 d:接收到的數(shù)據(jù).
*******************************************************************************/
u8 Spi376InByte(void){ //SPI接收一個(gè)字節(jié)數(shù)據(jù)
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET); //如果接受寄存器沒有收到數(shù)據(jù),循環(huán)
return SPI_I2S_ReceiveData(SPI2);
}
/*******************************************************************************
* 描 述 : 向CH376寫 命令.
* 輸 入 : u8 mCmd:要發(fā)送的命令.
*******************************************************************************/
void xWriteCH376Cmd(u8 mCmd){
GPIO_SetBits(SPI2PORT,SPI2_NSS); /* 防止之前未通過xEndCH376Cmd禁止SPI片選 */
delay_us(20);
/* 對于雙向I/O引腳模擬SPI接口,那么必須確保已經(jīng)設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出
* 方向,SPI_SDO為輸入方向 */
GPIO_ResetBits(SPI2PORT,SPI2_NSS); /* SPI片選有效 */
Spi376OutByte( mCmd ); /* 發(fā)出命令碼 */
delay_us(1700); /* 延時(shí)1.5mS確保讀寫周期大于1.5mS,或者用上面一行的狀態(tài)查詢代替 */
}
/*******************************************************************************
* 描 述 : 向CH376寫 數(shù)據(jù).
* 輸 入 : u8 mData:
* 要發(fā)送的數(shù)據(jù).
*******************************************************************************/
void xWriteCH376Data(u8 mData){
Spi376OutByte( mData );
delay_us(800); /* 確保讀寫周期大于0.6mS */
}
/*******************************************************************************
* 函 數(shù) 名 : xReadCH376Data
* 描 述 : 從CH376讀數(shù)據(jù).
*******************************************************************************/
u8 xReadCH376Data(void){
u8 i;
delay_us(10);
i = SPI2_SendByte(0xFF);
return(i);
}
/*******************************************************************************
* 描 述 : 查詢CH376中斷(INT#低電平).
* 返 回 : 0:無中斷. 1:有中斷.
*******************************************************************************/
u8 Query376Interrupt(void){
u8 i;
i = GPIO_ReadInputDataBit(CH376_INTPORT,CH376_INT);
return( i );
}
/*******************************************************************************
* 描 述 : 初始化CH376.
* 返 回 : FALSE:無中斷. TRUE:有中斷.
*******************************************************************************/
u8 mInitCH376Host(void){
u8 res;
delay_ms(600);
CH376_PORT_INIT( ); /* 接口硬件初始化 */
xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機(jī)與CH376之間的通訊接口 */
xWriteCH376Data( 0x55 );
res = xReadCH376Data( );
// printf("res =%02x \n",(unsigned short)res);
xEndCH376Cmd( );
if ( res != 0xAA ) return( ERR_USB_UNKNOWN ); /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */
xWriteCH376Data( 0x06 ); //06H=已啟用的主機(jī)方式并且自動(dòng)產(chǎn)生SOF包 ???
delay_us(20);
res = xReadCH376Data( );
// printf("res =%02x \n",(unsigned short)res);
xEndCH376Cmd( );
if ( res == CMD_RET_SUCCESS ){ //RES=51 命令操作成功
return( USB_INT_SUCCESS ); //USB事務(wù)或者傳輸操作成功
}else{
return( ERR_USB_UNKNOWN );/* 設(shè)置模式錯(cuò)誤 */
}
}
|
|