两个AD7705工作,每个AD的通道与数据颠倒?????

2019-08-17 09:35发布

STM32F103RCT6与AD7705。之前使用一个AD芯片,通道1与通道2的数据是一一对应的;现在使用两个AD同时工作,每个AD芯片各自的通道1和通道2的数据正好颠倒了。请问有人遇到过这种问题吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
ZHLGYN
1楼-- · 2019-08-17 10:54
问题解决了,初始化通道的时候加了一个延时,选中数据寄存器的时候,又加了一个延时,读出来的数据就好了,AD真心不好调试啊
正点原子
2楼-- · 2019-08-17 16:11
帮顶
ZHLGYN
3楼-- · 2019-08-17 17:43
昨天说的有点不对,单个芯片工作,两个通道的数据也是颠倒的
ZHLGYN
4楼-- · 2019-08-17 23:25
void AD7705_1_WriteByte(u8 Dst_Addr1)   
{   
        CS1_LOW();
        delay_us(20);
        SPI1_ReadWriteByte(Dst_Addr1);
        delay_us(100);
        CS1_HIGH();
}

void Init_AD7705_1(u8 channel)
{
        u8 i;
        for(i=0;i<100;i++)                                                                                        //&#182;àóúá&#172;D&#248;32&#184;&#246;DIN=1ê1′&#174;&#191;ú&#184;′&#206;&#187;                                                                                                                               
        {
                AD7705_1_WriteByte(0xff);             //3&#214;D&#248;DIN&#184;&#223;μ&#231;&#198;&#189;D′2ù×÷£&#172;&#187;&#214;&#184;′AD7705&#189;ó&#191;ú
        }  
        delay_ms(1);                            //
        switch(channel)                         //í¨μà&#209;&#161;&#212;&#241;
        {
                case 1:
                        AD7705_1_WriteByte(0x20);           //D′í¨&#209;&#182;&#188;&#196;′&#230;&#198;÷£&#172;&#209;&#161;&#214;Dí¨μà1£&#187; DRDY RS2 RS1 RS0 RW STBY CH1 CH0
                                                      //&#209;&#161;&#212;&#241;ê±&#214;ó&#188;&#196;′&#230;&#198;÷£&#172;            0   0   1   0   0   0   0   0
                        AD7705_1_WriteByte(0x0b);           //D′ê±&#214;ó&#188;&#196;′&#230;&#198;÷éè&#214;&#195;&#184;üD&#194;&#203;ù&#194;ê&#206;a£o4.9152MHzê±&#214;ó£&#172;200HZêy&#190;Yê&#228;3&#246;&#184;üD&#194;&#203;ù&#194;ê
               
                        AD7705_1_WriteByte(0x10);           //D′í¨&#209;&#182;&#188;&#196;′&#230;&#198;÷£&#172;&#209;&#161;&#214;Dí¨μà1£&#187; DRDY RS2 RS1 RS0 RW STBY CH1 CH0
                                                      //&#209;&#161;&#212;&#241;éè&#214;&#195;&#188;&#196;′&#230;&#198;÷              0   0   0   1   0   0   0   0
                        AD7705_1_WriteByte(0x44);           //D′éè&#214;&#195;&#188;&#196;′&#230;&#198;÷£&#172;éè&#214;&#195;3é×&#212;D£×&#188;£&#172;&#212;&#246;ò&#230;&#206;a1£&#172;μ¥&#188;&#171;D&#212;£&#172;&#206;T&#187;o3&#229;£&#172;&#194;&#203;2¨&#198;÷1¤×÷
                       
                        break;
               
                case 2:
                        AD7705_1_WriteByte(0x21);         
                                                      //&#209;&#161;&#212;&#241;ê±&#214;ó&#188;&#196;′&#230;&#198;÷£&#172;            0   0   1   0   0   0   0   1
                        AD7705_1_WriteByte(0x0b);           
                       
                        AD7705_1_WriteByte(0x11);         
                        AD7705_1_WriteByte(0x44);         
                       
                        break;
               
                default:       
                        break;
        }
}

u16 GetData7705_1(u8 channel)
{
        u16 temp = 0;
        u16 DataH = 0;
        u16 DataL = 0;
        switch(channel)
        {
                case 1:
                        Init_AD7705_1(1);         
                        delay_ms(1);
                        AD7705_1_WriteByte(0x38);  
                        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)  //′&#248;êy&#190;Y×&#188;±&#184;o&#195;  AdDrdy = 0
                        {
                                ;
                        }
                        CS1_LOW();                         //′ò&#191;aμúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        delay_us(20);
                        DataH = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;&#184;&#223;°&#203;&#206;&#187;êy&#190;Y
                        DataL = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;μí°&#203;&#206;&#187;êy&#190;Y
                        delay_us(200);
                        CS1_HIGH();                        //1&#216;±&#213;μúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        DataH = DataH<<8;
                        temp = DataH|DataL;                                         //×éo&#207;3é16&#206;&#187;μ&#196;êy&#190;Y
                       
                        break;
                       
                case 2:
                        Init_AD7705_1(2);                  //3&#245;ê&#188;&#187;ˉμúò&#187;&#184;&#246;ADμ&#196;í¨μà2
                        delay_ms(1);
                        AD7705_1_WriteByte(0x39);          //&#209;&#161;&#214;Dí¨μà1μ&#196;êy&#190;Y&#188;&#196;′&#230;&#198;÷&#182;á
                        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)    //′&#248;êy&#190;Y×&#188;±&#184;o&#195;  AdDrdy = 0
                        {
                                ;
                        }
                        CS1_LOW();                         //′ò&#191;aμúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        delay_us(20);
                        DataH = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;&#184;&#223;°&#203;&#206;&#187;êy&#190;Y
                        DataL = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;μí°&#203;&#206;&#187;êy&#190;Y
                        delay_us(200);      
                        CS1_HIGH();                        //1&#216;±&#213;μúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        DataH = DataH<<8;
                        temp = DataH|DataL;                                   //×éo&#207;3é16&#206;&#187;μ&#196;êy&#190;Y       
                       
                        break;
        }
        return temp;                           //·μ&#187;&#216;&#182;áè&#161;μ&#189;μ&#196;êy&#190;Y
}
ZHLGYN
5楼-- · 2019-08-18 01:32
 精彩回答 2  元偷偷看……
ZHLGYN
6楼-- · 2019-08-18 07:21
现在有个笨的方法解决了,就是每次切换通道前,先复位AD芯片,这样芯片的使用寿命会不会大大减少?

一周热门 更多>