我要使用SPI接口从ATT7022E中读取指定的寄存器,为什么总会延迟四个字节?

2019-07-20 21:14发布

买了原子的F4的开发板,照着原子哥的例程写了个SPI通讯程序驱动ATT7022E,SPI初始化和端口设置应该是正常的,但现在问题是每次读寄存值,总是在下一次操作是才能读到上一次要的结果,这个程序该怎么写才正确? ATT7022E是先发送1个8位的操作数,等2US左右再读写24位数据,问题是:SPI是全双工的,在发送的同时就接收数据,我如果先发8位指令,再接收,结果就会丢失高8位,如下面程序 u32 SPI_ATT_Read(u8 data)
 {
  u32 temp=0;
 ATT7022E_CS=0;  SPI1_ReadWriteByte(data);  delay_us(5);  temp=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 ATT7022E_CS=1;
 return (temp);
  }
如果发送同时接收,可以正常收到24位返回值,但是问题是每次发的指令,该指令对应的返回值要在下一次读的时候才能正确读出来,如下面的程序 u32 SPI_ATT_Read(u8 data)
 {
  u32 temp=0;
 ATT7022E_CS=0;  temp=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
 temp<<=8;
 temp|=SPI1_ReadWriteByte(data);
SPI1_ReadWriteByte(data);  ATT7022E_CS=1;
 return (temp);
  }
我才学ARM不久,有点糊了,按ATT7022E的手册应该第一个程序是对的,但实际运行结果是高8位丢失,后面的程序是,每个读操作要第二次读才能读出上次发的操作数对应的结果。这个问题搞了两天了,没搞定,请各位高手帮帮我。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
gb8931156
2019-07-23 06:23
楼主问题解决没 ,我现在也在用ATT7022EU做项目。mcu用的是VBT6,现在SPI通讯正常,我怀疑是你SPI的极性设置的问题。SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为低电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样unsigned long  ATT7022read(u8 addres)
   {

                 unsigned long temp,temp1,temp2,temp3;
         ATT7022E_CS=1;
         delay_us(2);
             ATT7022E_CS=0;
             SPI1_ReadWriteByte( addres);
             delay_us(2);
             temp1=SPI1_ReadWriteByte( 0xff);
             temp2=SPI1_ReadWriteByte( 0xff);
         temp3=SPI1_ReadWriteByte( 0xff);
         temp=(temp1<<16)|(temp2<<8)|temp3;
             ATT7022E_CS=1;          
             return temp;
   }

void   ATT7022write(u8 addres,unsigned long data)
   {
          
          
             u8  temp1,temp2,temp3;
         ATT7022E_CS=1;
         delay_us(2);
             ATT7022E_CS=0;
             SPI1_ReadWriteByte( addres);
             delay_us(2);
             temp1=(u8)(data>>16);
             temp2=(u8)(data>>8);
             temp3=(u8)(data);
             SPI1_ReadWriteByte( temp1);
             SPI1_ReadWriteByte(temp2);
         SPI1_ReadWriteByte( temp3);      
             ATT7022E_CS=1;  
       
               }

一周热门 更多>