void spi_init()
{
uchar temp;
DDRB|=0x07;//PB0,1,2=1,输出
PORTB|=BIT(2);//PB3打开上垃电阻
//PORTB|=0x03;//禁止SPI片选,设置SCS默认高电平
SPCR=0x5C;//使能SPI,主机模式
SPSR=0x00;//倍速模式
temp = SPSR;
temp = SPDR;//清空SPI,和中断标志,使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 ); /* 测试单片机与CH376之间的通讯接口*/
xWriteCH376Data( 0x55 );
//xReadCH376Data();
res = xReadCH376Data();
xEndCH376Cmd();
if ( res != 0xAA ) return( ERR_USB_UNKNOWN ); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */
//else
//{
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */
delay_ms(10);
xWriteCH376Data( 0x06 );
res =xReadCH376Data();
xEndCH376Cmd();
if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );
else return( ERR_USB_UNKNOWN ); /* 设置模式错误 */
//}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mStopIfError( UINT8 iError )
{
if ( iError == USB_INT_SUCCESS ) return; /* 操作成功 */
while ( 1 ) {
delay_ms( 200 );
delay_ms( 200 );
}
}
//向376读写数据
unsigned char Spi376dataExchange( UINT8 M_Data) /* 硬件SPI输出且输入8个位数据 */
{
SPDR = M_Data; /* 启动数据传输 */ //传输第一个数据启动时钟输出
while(!(SPSR & (1< return(SPDR);
}
void xWriteCH376Data( UINT8 mData ) /* 向CH376写数据 */
{
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);
}
//写命令
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */
{
//DDRB|=BIT(0);
PORTB|=BIT(0); /* 禁止SPI片选 CS*/
delay_ms(10);
//P2OUT &=0xef; /* SPI片选有效 */
PORTB&=~BIT(0);
delay_ms(10);
Spi376dataExchange( mCmd ); /* 发出命令码 */
delay_ms(10); /* 延时1.5uS确保读写周期大于1.5uS,或者用上面一行的状态查询代替 */
}
UINT8 Query376Interrupt( void )
{
DDRB&=~BIT(5); //PB5作为int#使用
if (!(PINB5&0x10)) // 检测输入端口是否有低电平
return(TRUE );
else
return(FALSE);
}
以上是本人的SPI初始化以及376初始化部分程序,每次SPI发送测试命令时都读取不到返回值,正常情况应该有0XAA,但是从SPI的数据寄存器SPDR没有返回值,请问这是什么情况