求助RX8025T无ACK应答信号(有逻辑分析图)

2020-01-13 18:23发布

只是写了一 个简单的测试程序,上电就直接读取时间,程序如下:
void start(void)
{
        sda=1;
        Delay_us(10);
        scl=1;
        Delay_us(10);
        sda=0;
        Delay_us(10);
}

void stop(void)
{
        sda=0;
        Delay_us(10);
        scl=1;
        Delay_us(10);
        sda=1;
        Delay_us(10);
}

void ack(void)
{
        unsigned char i=200;
        scl=1;
        Delay_us(10);
        while ((sda==1)&&(i>0))i--;
        scl=0;
        Delay_us(10);
}

void iicinit(void)
{
        sda=1;
        scl=1;
}

void iicwr_byte(unsigned char dat)
{
        unsigned char i;
        scl=0;
        for(i=0;i<8;i++)
        {
                if(dat&0x80)
                {
                        sda=1;
                }
                else
                {
                        sda=0;
                }
                dat=dat<<1;
                Delay_us(10);
                scl=1;
                Delay_us(10);
                scl=0;
                Delay_us(10);
        }
}
void READ_TIM(void)
{
        start();                   //1
        iicwr_byte(0x64);  //2
        ack();                           //3
        iicwr_byte(0x00);  //4
        ack();                           //5
        start();                   //6
        iicwr_byte(0x65);  //7
        ack();                           //8
        TIM_Second=iicre_byte();//9 读秒
        ack();                                 //10
        TIM_Minute=iicre_byte();//9 读分钟
        ack();                                 //10
        TIM_Hour=iicre_byte();//9 读小时
        ack();                                 //10
        stop();                                 //13
}

出来的实际波形图:
1111111.png (124.25 KB, 下载次数: 0) 下载附件 2019-5-8 03:27 上传
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
aozima
1楼-- · 2020-01-13 20:01
读的时候,ACK不应该是主机发的么。
laoshuhunya
2楼-- · 2020-01-14 01:44
要接收ACK,SDA需要置1拉高
wxdn
3楼-- · 2020-01-14 04:24
 精彩回答 2  元偷偷看……
wxdn
4楼-- · 2020-01-14 07:45
laoshuhunya 发表于 2019-5-8 21:19
要接收ACK,SDA需要置1拉高

试了SDA接高后,需要1秒以后,RX8025才会置高,反应需要好久,且无视SCL的状态。
laoshuhunya
5楼-- · 2020-01-14 11:44
wxdn 发表于 2019-5-8 21:23
SCL的状态需要改变吗?

SCL需要一个下降沿和一个上升沿。所有位数据(包括ACK)会在SCL下降沿发送,在SCL上升沿接收。
以下模拟IIC的发送ACK和接收ACK函数供参考。(最好在PC上看,因为在手机屏幕上长注释会换行)
  
  1. //*****************************************************************************主机发送应答信号
  2. // SendAck_NBCA_MI2C Function (I2C)
  3. //-----------------------------------------------------------------------------
  4. // Return Value : None
  5. // Parameters   : I2C_Master_TypeDef *, volatile I2C_MasterAckBit_TypeDef
  6. /*-----------------------------------------------------------------------------
  7.    功能说明:
  8.      (1)函数返回值:
  9.      (2)pMasterx_I2C:指向结构体 I2C_Master_TypeDef 的指针变量,HDI函数通过此指针变量操作I2C总线。
  10.      (3)AckBit:主机要发送的应答信号。“MI2C_ACK”为正态应答信号(逻辑“0”),“MI2C_NACK”为反态应答信号(逻辑“1”)。
  11. ------------------------------------------------------------------------------*/

  12. void SendAck_NBCA_MI2C(I2C_Master_TypeDef * pMasterx_I2C, volatile I2C_MasterAckBit_TypeDef AckBit)
  13. {   
  14.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
  15.     (AckBit)? (SDAW1()): (SDAW0());
  16.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);

  17.     SCLW1();
  18.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
  19.     SCLW0();
  20. }

  21. //*****************************************************************************主机接收应答信号
  22. // RecAck_NBCA_MI2C Function (I2C)
  23. //-----------------------------------------------------------------------------
  24. // Return Value : uint8_t
  25. // Parameters   : I2C_Master_TypeDef *
  26. /*-----------------------------------------------------------------------------
  27.    功能说明:
  28.      (1)函数返回值:接收到的应答信号。数值“0”为正态应答信号(MI2C_ACK),数值“1”为反态应答信号(MI2C_NACK)。
  29.      (2)pMasterx_I2C:指向结构体 I2C_Master_TypeDef 的指针变量,HDI函数通过此指针变量操作I2C总线。
  30. ------------------------------------------------------------------------------*/

  31. uint8_t RecAck_NBCA_MI2C(I2C_Master_TypeDef * pMasterx_I2C)
  32. {  
  33.     volatile uint8_t AckBit;
  34. //-------------------------------------------------------------
  35.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
  36.     SDAW1();
  37.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);

  38.     SCLW1();
  39.     AckBit = (SDAR())? (MI2C_NACK): (MI2C_ACK);

  40.     Delay_MI2C(pMasterx_I2C->DelayTime_MI2C);
  41.     SCLW0();
  42. //-------------------------------------------------------------
  43.     return AckBit;
  44. }
复制代码
wxdn
6楼-- · 2020-01-14 15:49
laoshuhunya 发表于 2019-5-8 21:48
SCL需要一个下降沿和一个上升沿。所有位数据(包括ACK)会在SCL下降沿发送,在SCL上升沿接收。
以下模拟I ...

试了,还是不行,奇怪了。

222.jpg (110.08 KB, 下载次数: 0)

下载附件

2019-5-8 22:23 上传



一周热门 更多>