求助 ATmega128 读写CH376s时SPI通信问题

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没有返回值,请问这是什么情况


首先,排除硬件的问题,晶振是否起振,SPI模式的话WR#、RD#接地,复位输出(25脚)是否为低电平。软件上,就是时序的问题,用示波器看一下你发过去的波形是否正确。


我直接买的是江苏沁恒公司的CH376S模块,芯片什么的都是焊好的,按照网上的说法测了一下晶振,应该是起振的,绿色的指示灯也亮了,硬件应该没什么问题吧,那有可能是软件的问题了,可是一直没找到,郁闷啊


最好测量一下WR#、RD#、RST脚的电平。软件的话对照我们提供的51单片机的例子,读写函数之间的延时1~2us就够了。


只有登录才能回复,可以选择微信账号登录