STM32 AD7792驱动调试总结

调了好久,终于通了。。为什么用了一周时间这么久?主要原因是我不知道隔离模块有问题,导致一直是盲目的改代码,今天没办法,直接把隔离模块短路,一下子就读出了ID号。

7792挂在SPI2上,PB12,PB13,PB14,PB15,可我用SPI调的时候一直读出来是0XFF,以为是SPI2有问题,于是我直接抛弃SPI,用时序直接读。很好用!!!

下面是我的代码:

 

#define SCLOCK1   GPIO_SetBits(GPIOB,GPIO_Pin_13);
  #define SCLOCK0   GPIO_ResetBits(GPIOB,GPIO_Pin_13);

  #define CS1       GPIO_SetBits(GPIOB,GPIO_Pin_12);
  #define CS0       GPIO_ResetBits(GPIOB,GPIO_Pin_12);

  #define DIN1      GPIO_SetBits(GPIOB,GPIO_Pin_15);
  #define DIN0      GPIO_ResetBits(GPIOB,GPIO_Pin_15);

  #define DOUT1     GPIO_SetBits(GPIOB,GPIO_Pin_14);
  #define DOUT0     GPIO_ResetBits(GPIOB,GPIO_Pin_14);
void Delay(unsigned  int Time)
{

     while(Time)
    {
        Time--;
    }
}
unsigned  char DataRead[ 3];
void WriteToReg(unsigned  char ByteData)  //  write ByteData to the register
{
    unsigned  char temp;
     int i;    
    CS0;
    temp= 0x80;
     for(i= 0;i< 8;i++)
    {
          if((temp & ByteData)== 0)
        {        
              DIN0;
        }    
          else
        {
             DIN1;
         }
        SCLOCK0;
        Delay( 10);
           SCLOCK1;
        Delay( 10);
         temp=temp>> 1;
    }
    CS1;
}


void ReadFromReg(unsigned  char nByte)  //  nByte is the number of bytes which need to be read
{
     int i,j;
       unsigned  char temp;
       DIN1;
     CS0;
    temp= 0;
//     DOUT1;

     for(i= 0; i<nByte; i++)
    {
         for(j= 0; j< 8; j++)
        {
             SCLOCK0;
              if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)== 0)
             {
                temp=temp<< 1;
             } else
             {
                temp=temp<< 1;
                 temp=temp+ 0x01;
            }
            Delay( 10);
            SCLOCK1;
            Delay( 10);
          }
          DataRead[i]=temp;
          temp= 0;
    }
    CS1;
}
extern  void SSD1305_ShowASC16(u8 x,u8 y,u8 len,unsigned  char *str);
void task_7792( void* parameter)
{
     char str[ 20];
     short iData[ 3];
     int ResetTime;    
     /*  PRECONFIGURE... */
    ResetTime= 32;

    SCLOCK1; 
     CS0;           // to keep DIN=1 for 32 sclock to reset the part
     DIN1;
      while(ResetTime--)
    {
        Delay( 10);
        SCLOCK0;
        Delay( 10);
         SCLOCK1;
    }
     CS1;    

     while( 1)
    {
          WriteToReg( 0x10);  // write to Communication register.The next step is writing to Configuration register.
        WriteToReg( 0x00);  // set the Configuration bipolar mode.Gain=1.
        WriteToReg( 0x80);  // Configuration internal reference selected.     

        WriteToReg( 0x08); // write to Communication register.The next step is writing to Mode register.
        WriteToReg( 0x20); // set the mode register as single conversion mode.
        WriteToReg( 0x00); // inter 64 kHZ clock.internal clock is not available at the clk pin.
        
        WriteToReg( 0x40); // write to Communication register.The next step is to read from Status register.
        ReadFromReg( 1);    
         while((DataRead[ 0]& 0x80)== 0x80) // wait for the end of convertion by polling the status register RDY bit
        {            
            WriteToReg( 0x40); 
            ReadFromReg( 1);    
        }
        WriteToReg( 0x58); // write to Communication register.The next step is to read from Data register.
    
//     WriteToReg(0x60) ;
        ReadFromReg( 2);
        memcpy(&iData[ 0],&DataRead[ 0], 2);    
        sprintf(str, " %d ",iData[ 0]);
        SSD1305_ShowASC16( 10, 20, 6,str) ;          
     //     printf("Data:%02BX %02BX\r\n",DataRead[0],DataRead[1]);     }
}

嗯。出来了。。。。下面 就是自己配置寄存器,看读出来是哪个通道的值!

 

转载于:https://www.cnblogs.com/sankye/articles/2487664.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值