求ATT7022CU的读写程序

2020-02-06 10:11发布

本帖最后由 fangjikun 于 2013-2-28 11:30 编辑

     PIC18F4520控制ATT7022CU,IO模拟SPI,现在7022的工作状态没有问题是正常的
    (复位后随意写7022里的一个寄存器,SIG信号变为高,另外11脚REFOUT电压2.33V,也正常)
    ABC输入端短接后加AC电(可调),在三个电压输入管脚测电压有65mv(随意加的),但读出全是0

   以下是程序:

#define Att7022cu_Cs          LATC0
#define Att7022cu_Rst         LATA6
#define Att7022cu_Sig         RA7
#define Att7022cu_Rf_Sclk           LATC3
#define Att7022cu_Rf_Data_Out   LATC5
#define Att7022cu_Rf_Data_In     RC4

unsigned long Read7022(unsigned char Addr)
{
        unsigned char i;
        unsigned long Out_Data=0;

        Addr &= 0x7f;//bit7=0:读命令,bit7=1:写命令
                           //bit6--0:地址
        Att7022cu_Cs=1;
        Att7022cu_Rf_Sclk=0;
        Att7022cu_Cs=0;delay();
        for(i=8; i>0; i--)
           {
                Att7022cu_Rf_Sclk=1;
                delay();
            if(Addr&0x80)
                {Att7022cu_Rf_Data_Out=1;}
            else
                {Att7022cu_Rf_Data_Out=0;}
            Att7022cu_Rf_Sclk=0;
            delay();
            Addr<<=1;
           }
        delay();//
        for(i=24; i>0; i--)
                {
             Att7022cu_Rf_Sclk=1;
             delay();
             Out_Data<<=1;
             Out_Data |= Att7022cu_Rf_Data_In;
             Att7022cu_Rf_Sclk=0;
             delay();
              
                }
        Att7022cu_Cs=1;
      //  Out_Data=0x12345678;  //等于此值在串口调试助手里能看到低8位的“78”值
        return Out_Data;//若直接返回就是全零了
}

void Write7022(unsigned char Addr, unsigned long Out_Data)
{
        unsigned char i;
        
                Addr=(Addr&0xbf)|0x80;   //bit7=0:读命令,bit7=1:写命令
        //即Addr=0b10 000000;        低6位为地址                                     
       
        Att7022cu_Cs=1;
        Att7022cu_Rf_Sclk=0;
        Att7022cu_Cs=0;
        
         for(i=8; i>0; i--)
           {Att7022cu_Rf_Sclk=1;
            if(Addr&0x80)
                {Att7022cu_Rf_Data_Out=1;}
                else
                 {Att7022cu_Rf_Data_Out=0;}
            Addr<<=1;
            Att7022cu_Rf_Sclk=0;
           }
        delay();
        for(i=24; i>0; i--)
           {Att7022cu_Rf_Sclk=1;
            if(Out_Data&0x80)
                {Att7022cu_Rf_Data_Out=1;}
                else
                 {Att7022cu_Rf_Data_Out=0;}
                Out_Data<<=1;
                Att7022cu_Rf_Sclk=0;
           }
        delay();
        Att7022cu_Cs=1;
        
}




void tx_data(void)
{   unsigned char i;
    txbuff[0]=Read7022(0x01);
    txbuff[1]=Read7022(0x0d);
    txbuff[2]=Read7022(0x0e);
    txbuff[3]=Read7022(0x0f);
    txbuff[4]=Read7022(0x28)
        txbuff[5]=Read7022(0x2d);
        txbuff[6]=Read7022(0x2e);
    txbuff[7] =Read7022(0x3c);
    txbuff[8]=Read7022(0x3d);
    EN485=1;delay();//发送状态     
        for(i=0;i<9;i++)
       {
                TXREG=txbuff;//发送
                while(!TRMT);//asm("nop");//delay();
                }          
        EN485=0;delay();//转为接收状态
       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。