亚博智能论坛  
  
查看: 506|回复: 0

利用模拟IIC读取AM1805得不到应答

[复制链接]
  • TA的每日心情
    大哭
    2017-7-26 09:46
  • 29

    主题

    51

    帖子

    155

    积分

    菜鸟程序猿

    Rank: 2

    积分
    155
    发表于 2017-6-20 17:07:41 | 显示全部楼层 |阅读模式

    最近在项目中用到了时钟芯片AM1805(IIC接口),但是读出的数据一直是0XFF,经过仿真发现在写入指令后,单片机得不到AM1805的应答,已经调试三天了不知道问题在哪,希望大家帮忙看看,以下是我的程序
    1. //IIC开始
    2. void IIC_Start(void)
    3. {
    4. SDA_OUT();     //sda设置为输出
    5. IIC_SDA=1;      
    6. IIC_SCL=1;
    7. delay_us(4);
    8.   IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    9. delay_us(4);
    10. IIC_SCL=0;//释放总线
    11. delay_us(1);
    12. }
    13. //停止IIC
    14. void IIC_Stop(void)
    15. {
    16. SDA_OUT();//sda设置为输出
    17. IIC_SCL=0;
    18. IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    19.   delay_us(4);
    20. IIC_SCL=1;
    21. IIC_SDA=1;//释放总线
    22. delay_us(4);           
    23. }
    24. //等待从机应答
    25. u8 IIC_Wait_Ack(void)
    26. {
    27. u8 ucErrTime=0;
    28. SDA_IN();      //SDA?????  
    29. IIC_SDA=1;delay_us(1);   
    30. IIC_SCL=1;delay_us(1);  
    31. while(READ_SDA)
    32. {
    33.   ucErrTime++;
    34.   if(ucErrTime>250)
    35.   {
    36.    IIC_Stop();
    37.    return 1;
    38.   }
    39. }
    40. IIC_SCL=0;//????0     
    41. return 0;  
    42. }
    43. //主机应答
    44. void IIC_Ack(void)
    45. {
    46. IIC_SCL=0;
    47. SDA_OUT();
    48. IIC_SDA=0;
    49. delay_us(2);
    50. IIC_SCL=1;
    51. delay_us(2);
    52. IIC_SCL=0;
    53. }
    54. //主机不应答      
    55. void IIC_NAck(void)
    56. {
    57. IIC_SCL=0;
    58. SDA_OUT();
    59. IIC_SDA=1;
    60. delay_us(2);
    61. IIC_SCL=1;
    62. delay_us(2);
    63. IIC_SCL=0;
    64. }               
    65. //向IIC写一个字节   
    66. void IIC_Write_Byte(u8 txd)
    67. {                        
    68.     u8 t;   
    69. SDA_OUT();      
    70.     IIC_SCL=0;//
    71.     for(t=0;t<8;t++)
    72.     {              
    73.         //IIC_SDA=(txd&0x80)>>7;
    74.   if((txd&0x80)>>7)
    75.    IIC_SDA=1;
    76.   else
    77.    IIC_SDA=0;
    78.   txd<<=1;   
    79.   delay_us(2);   //
    80.   IIC_SCL=1;
    81.   delay_us(2);
    82.   IIC_SCL=0;
    83.   delay_us(2);
    84.     }  
    85. }   
    86. //读取一个字节  

    87. u8 IIC_Read_Byte(void)
    88. {
    89.   unsigned char i,receive=0;
    90.   SDA_IN();//SDA设置为输入
    91.    for(i=0;i<8;i++ )
    92.   {
    93.      IIC_SCL=0;
    94.      delay_us(2);
    95.    IIC_SCL=1;
    96.      receive<<=1;
    97.      if(READ_SDA)receive++;   
    98.    delay_us(1);
    99.    }        
    100.    return receive;
    101. }

    102. void AM1805_Write_Addr(u8 REG_ADD)
    103. {  
    104.   IIC_Write_Byte(REG_ADD);//?/д??
    105.   IIC_Wait_Ack();
    106. }
    107. void AM1805_Write_Byte(u8 REG_ADD,u8 dat)
    108. {  
    109. //  IIC_Start();
    110.   IIC_Write_Byte(REG_ADD);//?/д??
    111.   IIC_Wait_Ack();
    112.   IIC_Write_Byte(dat);//????
    113.   IIC_Wait_Ack();
    114. //  IIC_Stop();
    115. }


    116. }      

    117. u8 IIC_Read_Byte(void)
    118. {
    119.   unsigned char i,receive=0;
    120.   SDA_IN();//SDA设置为输入
    121.    for(i=0;i<8;i++ )
    122.   {
    123.      IIC_SCL=0;
    124.      delay_us(2);
    125.    IIC_SCL=1;
    126.      receive<<=1;
    127.      if(READ_SDA)receive++;   
    128.    delay_us(1);
    129.    }        
    130.    return receive;
    131. }



    132. uint8_t AM18XX_ReadOneByte(uint8_t ReadAddr)
    133. {      
    134.    uint8_t temp=0;
    135.   IIC_Start();//开始
    136.   IIC_Write_Byte(0xD2);//AM1805写命令
    137.   if(IIC_Wait_Ack())//等待应答
    138.   {
    139.    temp=1;
    140.   }
    141.     AM1805_Write_Addr(ReadAddr%256); ////写入操作地址
    142.   IIC_Wait_Ack();//等待应答
    143.   IIC_Start();//开始信号
    144.     IIC_Write_Byte(0xD3);//AM1805读取指令
    145.   IIC_Wait_Ack();//等待应答
    146.     temp= IIC_Read_Byte();//读取AM1805数据
    147.     IIC_Stop();//结束
    148. return temp;
    149. }
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表