打印

请教前辈ad7991程序问题,附上我的程序

[复制链接]
1003|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_bin|  楼主 | 2016-3-2 19:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ic, iic, TE, ST
最近在调试ad7991这块adc,出现了一些问题,希望大神能够帮助我
  uart_init(9600);         //串口初始化为115200
  IIC_Init();

                IIC_Start();                                                            //   
        IIC_Send_Byte(0x52);//发送地址 写0x52                   7位地址最后可能为0可能为1
        IIC_Wait_Ack();//等待响应 该加判断
        IIC_Send_Byte(0x70);           //发送命令
        IIC_Wait_Ack();//等待响应 该加判断
                IIC_Stop();

  while(1)
        {


//
                IIC_Start();
        IIC_Send_Byte(0x53);//发送地址  读
            IIC_Wait_Ack();//等待响应 该加判断
        p[0]=IIC_Read_Byte(1)        ;
        p[1]=IIC_Read_Byte(0)        ;
                IIC_Stop();

                IIC_Start();
        IIC_Send_Byte(0x53);//发送地址  读
            IIC_Wait_Ack();//等待响应 该加判断
        p[2]=IIC_Read_Byte(1)        ;
        p[3]=IIC_Read_Byte(0)        ;
                IIC_Stop();

                IIC_Start();
        IIC_Send_Byte(0x53);//发送地址  读
            IIC_Wait_Ack();//等待响应 该加判断
        p[4]=IIC_Read_Byte(1)        ;
        p[5]=IIC_Read_Byte(0)        ;
                IIC_Stop();
                for(t=0;t<6;t++)
                {
                                USART1->DR=p[t];
                                while((USART1->SR&0X40)==0);//等待发送结束
                }
                delay_ms(1000);
}
}

//初始化IIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        //RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOB, &GPIO_InitStructure);


        IIC_SCL=1;
        IIC_SDA=1;

}
//产生IIC起始信号
void IIC_Start(void)                                                                                                          
{
        SDA_OUT();     //sda线输出
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(10);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(10);
        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}          
//产生IIC停止信号
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(10);
        IIC_SCL=1;
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(10);                                                                  
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDA设置为输入  
        IIC_SDA=1;delay_us(10);          
        IIC_SCL=1;delay_us(10);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//时钟输出0           
        return 0;  
}
//产生ACK应答
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(10);
        IIC_SCL=1;
        delay_us(10);
//        IIC_SCL=0;
}
//不产生ACK应答                    
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(10);
        IIC_SCL=1;
        delay_us(10);
//        IIC_SCL=0;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(10);   //
                IIC_SCL=1;
                delay_us(10);
                IIC_SCL=0;       
                delay_us(10);
    }         
}             
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0;
        delay_us(10);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(10);
    }                                         
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

相关帖子

来自 2楼
_bin|  楼主 | 2016-3-3 10:39 | 只看该作者
我找到问题了,在 IIC_Read_Byte(unsigned char ack){}这个函数中,SDA_IN();//SDA设置为输入后面得加上,IIC_SDA=1;delay_us(1);不然电平不能拉高所以独处的数据都是0x00。

使用特权

评论回复
板凳
_bin|  楼主 | 2016-3-2 19:33 | 只看该作者
本帖最后由 _bin 于 2016-3-2 20:39 编辑

在输入悬空情况下,串口返回的数据全是FF  :'(  :'(:'(,求大神指教

使用特权

评论回复
地板
_bin|  楼主 | 2016-3-2 20:41 | 只看该作者
我用jlink硬件仿真测试了一下,发送地址和写命令都能得到ack,但是返回的数据为什么都是FF,有没有用过adc的大神帮帮我

使用特权

评论回复
5
_bin|  楼主 | 2016-3-2 21:05 | 只看该作者
输入都没接,返回值又变了,现在通道号是对的了,但是返回的第一个字节是乱的,第二个字节一直是00,

使用特权

评论回复
6
_bin|  楼主 | 2016-3-3 11:17 | 只看该作者
这贴子怎么结啊,求大神指教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝