#include "CH376.h"
/*******************************************************************************
* 函 数 名 : CH376_PORT_INIT
* 描 述 : 由于使用软件模拟SPI读写时序,所以进行初始化.
* 如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或
* mode0(CPOL=0&CPHA=0),CH376在时钟上升沿采样输入,下降沿输出,数
* 据位是高位在前.
*******************************************************************************/
void CH376_PORT_INIT(void){ //CH376的SPI接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
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); //片选接口接高电平
}
/*******************************************************************************
* 函 数 名 : xEndCH376Cmd 结束命令.
*******************************************************************************/
void xEndCH376Cmd(void){ //结束命令
GPIO_SetBits(SPI2PORT,SPI2_NSS); //SPI片选无效,结束CH376命令
}
/*******************************************************************************
SPI输出8个位数据. * 发送: u8 d:要发送的数据.
*******************************************************************************/
void Spi376OutByte(u8 d){ //SPI发送一个字节数据
SPI2_SendByte(d);
}
/*******************************************************************************
* 描 述 : SPI接收8个位数据. u8 d:接收到的数据.
*******************************************************************************/
u8 Spi376InByte(void){ //SPI接收一个字节数据
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET); //如果接受寄存器没有收到数据,循环
return SPI_I2S_ReceiveData(SPI2);
}
/*******************************************************************************
* 描 述 : 向CH376写 命令.
* 输 入 : u8 mCmd:要发送的命令.
*******************************************************************************/
void xWriteCH376Cmd(u8 mCmd){
GPIO_SetBits(SPI2PORT,SPI2_NSS); /* 防止之前未通过xEndCH376Cmd禁止SPI片选 */
delay_us(20);
/* 对于双向I/O引脚模拟SPI接口,那么必须确保已经设置SPI_SCS,SPI_SCK,SPI_SDI为输出
* 方向,SPI_SDO为输入方向 */
GPIO_ResetBits(SPI2PORT,SPI2_NSS); /* SPI片选有效 */
Spi376OutByte( mCmd ); /* 发出命令码 */
delay_us(1700); /* 延时1.5mS确保读写周期大于1.5mS,或者用上面一行的状态查询代替 */
}
/*******************************************************************************
* 描 述 : 向CH376写 数据.
* 输 入 : u8 mData:
* 要发送的数据.
*******************************************************************************/
void xWriteCH376Data(u8 mData){
Spi376OutByte( mData );
delay_us(800); /* 确保读写周期大于0.6mS */
}
/*******************************************************************************
* 函 数 名 : xReadCH376Data
* 描 述 : 从CH376读数据.
*******************************************************************************/
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 ); /* 测试单片机与CH376之间的通讯接口 */
xWriteCH376Data( 0x55 );
res = xReadCH376Data( );
// printf("res =%02x \n",(unsigned short)res);
xEndCH376Cmd( );
if ( res != 0xAA ) return( ERR_USB_UNKNOWN ); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */
xWriteCH376Data( 0x06 ); //06H=已启用的主机方式并且自动产生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事务或者传输操作成功
}else{
return( ERR_USB_UNKNOWN );/* 设置模式错误 */
}
}
|