求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();//转为接收状态
       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
步步高0217
1楼-- · 2020-02-07 03:48
哪位大侠有没有遇到过这种情况:校表时,SIG信号正确,但是校表之后读取的数据还是不正确
wangqh1983
2楼-- · 2020-02-07 05:30
现在进展的如何了,我弄的仪表总是有偶尔跳字情况,你的有吗?7022C里提到的各种安全机制都做了,还是无济于事!我用的是星龙的源。安捷伦测试输入信号很稳定,5V交流含量(3.8mV)
我之前也是用模拟IO做的SPI,数据更不稳定,后来改成硬件SPI好多了,时钟速率1M,还有这个东西的SPI硬件接口加那个低通会不会反到不好了,我用个是10ohm,15p.
技穷了,难道这个熊芯片就这德行吗,测试响应时间也是大于400ms,已经高于变送器标准了。最离谱的就是频率不稳。也可能我做的软件和硬件不过关,
有没有高人也遇到同样的问题,找到了解决方法了,麻烦回复一下,谢谢!!!
huangxiaowei
3楼-- · 2020-02-07 09:17
 精彩回答 2  元偷偷看……
caorui117017
4楼-- · 2020-02-07 11:56
表示用stm32的GPIO模拟SPI与att7022通讯问题很多
125591656
5楼-- · 2020-02-07 12:09
mark,学习中
12tangyang12
6楼-- · 2020-02-07 16:27
geminisongyemin 发表于 2013-4-22 00:06
是一个叫“ATT7022B应用笔记”的资料,那时候还叫珠海炬力呢

为啥这个文档下  下来是 乱码,,,,,

一周热门 更多>