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

[复制链接]
1201|5
 楼主| _bin 发表于 2016-3-2 19:31 | 显示全部楼层 |阅读模式
AD, ic, iic, TE, ST
最近在调试ad7991这块adc,出现了一些问题,希望大神能够帮助我
  1.   uart_init(9600);         //串口初始化为115200
  2.   IIC_Init();

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

  9.   while(1)
  10.         {


  11. //
  12.                 IIC_Start();
  13.         IIC_Send_Byte(0x53);//发送地址  读
  14.             IIC_Wait_Ack();//等待响应 该加判断
  15.         p[0]=IIC_Read_Byte(1)        ;
  16.         p[1]=IIC_Read_Byte(0)        ;
  17.                 IIC_Stop();

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

  24.                 IIC_Start();
  25.         IIC_Send_Byte(0x53);//发送地址  读
  26.             IIC_Wait_Ack();//等待响应 该加判断
  27.         p[4]=IIC_Read_Byte(1)        ;
  28.         p[5]=IIC_Read_Byte(0)        ;
  29.                 IIC_Stop();
  30.                 for(t=0;t<6;t++)
  31.                 {
  32.                                 USART1->DR=p[t];
  33.                                 while((USART1->SR&0X40)==0);//等待发送结束
  34.                 }
  35.                 delay_ms(1000);
  36. }
  37. }

  38. //初始化IIC
  39. void IIC_Init(void)
  40. {                                             
  41.         GPIO_InitTypeDef GPIO_InitStructure;
  42.         //RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟
  43.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
  44.           
  45.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  46.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  47.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  48.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  50.         GPIO_Init(GPIOB, &GPIO_InitStructure);


  51.         IIC_SCL=1;
  52.         IIC_SDA=1;

  53. }
  54. //产生IIC起始信号
  55. void IIC_Start(void)                                                                                                          
  56. {
  57.         SDA_OUT();     //sda线输出
  58.         IIC_SDA=1;                    
  59.         IIC_SCL=1;
  60.         delay_us(10);
  61.         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  62.         delay_us(10);
  63.         IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  64. }          
  65. //产生IIC停止信号
  66. void IIC_Stop(void)
  67. {
  68.         SDA_OUT();//sda线输出
  69.         IIC_SCL=0;
  70.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  71.         delay_us(10);
  72.         IIC_SCL=1;
  73.         IIC_SDA=1;//发送I2C总线结束信号
  74.         delay_us(10);                                                                  
  75. }
  76. //等待应答信号到来
  77. //返回值:1,接收应答失败
  78. //        0,接收应答成功
  79. u8 IIC_Wait_Ack(void)
  80. {
  81.         u8 ucErrTime=0;
  82.         SDA_IN();      //SDA设置为输入  
  83.         IIC_SDA=1;delay_us(10);          
  84.         IIC_SCL=1;delay_us(10);         
  85.         while(READ_SDA)
  86.         {
  87.                 ucErrTime++;
  88.                 if(ucErrTime>250)
  89.                 {
  90.                         IIC_Stop();
  91.                         return 1;
  92.                 }
  93.         }
  94.         IIC_SCL=0;//时钟输出0           
  95.         return 0;  
  96. }
  97. //产生ACK应答
  98. void IIC_Ack(void)
  99. {
  100.         IIC_SCL=0;
  101.         SDA_OUT();
  102.         IIC_SDA=0;
  103.         delay_us(10);
  104.         IIC_SCL=1;
  105.         delay_us(10);
  106. //        IIC_SCL=0;
  107. }
  108. //不产生ACK应答                    
  109. void IIC_NAck(void)
  110. {
  111.         IIC_SCL=0;
  112.         SDA_OUT();
  113.         IIC_SDA=1;
  114.         delay_us(10);
  115.         IIC_SCL=1;
  116.         delay_us(10);
  117. //        IIC_SCL=0;
  118. }                                                                              
  119. //IIC发送一个字节
  120. //返回从机有无应答
  121. //1,有应答
  122. //0,无应答                          
  123. void IIC_Send_Byte(u8 txd)
  124. {                        
  125.     u8 t;   
  126.         SDA_OUT();             
  127.     IIC_SCL=0;//拉低时钟开始数据传输
  128.     for(t=0;t<8;t++)
  129.     {              
  130.         IIC_SDA=(txd&0x80)>>7;
  131.         txd<<=1;           
  132.                 delay_us(10);   //
  133.                 IIC_SCL=1;
  134.                 delay_us(10);
  135.                 IIC_SCL=0;       
  136.                 delay_us(10);
  137.     }         
  138. }             
  139. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  140. u8 IIC_Read_Byte(unsigned char ack)
  141. {
  142.         unsigned char i,receive=0;
  143.         SDA_IN();//SDA设置为输入
  144.     for(i=0;i<8;i++ )
  145.         {
  146.         IIC_SCL=0;
  147.         delay_us(10);
  148.                 IIC_SCL=1;
  149.         receive<<=1;
  150.         if(READ_SDA)receive++;   
  151.                 delay_us(10);
  152.     }                                         
  153.     if (!ack)
  154.         IIC_NAck();//发送nACK
  155.     else
  156.         IIC_Ack(); //发送ACK   
  157.     return receive;
  158. }
 楼主| _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的大神帮帮我
 楼主| _bin 发表于 2016-3-2 21:05 | 显示全部楼层
输入都没接,返回值又变了,现在通道号是对的了,但是返回的第一个字节是乱的,第二个字节一直是00,
 楼主| _bin 发表于 2016-3-3 11:17 | 显示全部楼层
这贴子怎么结啊,求大神指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部