打印
[STM8]

请问STM8的I2C读1字节正常,连续多字节读后面都是0xff,什么原...

[复制链接]
1092|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM8, I2c, TE, mb, ge
本帖最后由 xieyongbin 于 2020-9-29 17:05 编辑

单片机是STM8L151
读1个字节正常, 连续读多字节,第一个也正常,但后面是0xFF

程序是否有错误?
    while(NumByte)
    {
        if (NumByte==1)
        {
            I2C_AcknowledgeConfig(I2C1, DISABLE);
            I2C_GenerateSTOP(I2C1, ENABLE);
            while ( I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET )
            pBuffer[Rx_Idx++] = I2C_ReceiveData(I2C1);
            NumByte--;
        }
        if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
        {   
            I2C_AcknowledgeConfig(I2C1,ENABLE);
            pBuffer[Rx_Idx++] = I2C_ReceiveData(I2C1);
            NumByte--;
        }
    }

使用特权

评论回复
沙发
god9987| | 2020-9-30 14:58 | 只看该作者
感觉 使用 while 的地方 有时候 会卡死

使用特权

评论回复
板凳
god9987| | 2020-9-30 15:16 | 只看该作者
使用 逻辑分析仪!

匹配电阻 都需要

使用特权

评论回复
地板
xieyongbin|  楼主 | 2020-10-3 11:25 | 只看该作者



官方停止位HAL库函数
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
    /* Check function parameters */
    assert_param(IS_FUNCTIONAL_STATE(NewState));
    if (NewState != DISABLE)
    {
    /* Generate a STOP condition */
      I2Cx->CR2 |= I2C_CR2_STOP;
    }
    else /* NewState == DISABLE */
    {
    /* Disable the STOP condition generation */
      I2Cx->CR2 &= (uint8_t)(~I2C_CR2_STOP);
    }
}


上逻辑分析仪观察,问题出在停止位,用HAL库函数会多出一个字节
不懂这个停止位库函数问题出在哪?

使用特权

评论回复
5
heimaojingzhang| | 2020-10-12 08:33 | 只看该作者
跟实际需要接受的字节数相符合吗

使用特权

评论回复
6
keaibukelian| | 2020-10-12 08:37 | 只看该作者
0xff是多余的 还是错误的啊

使用特权

评论回复
7
xieyongbin|  楼主 | 2020-10-31 12:40 | 只看该作者
本帖最后由 xieyongbin 于 2020-10-31 12:45 编辑
keaibukelian 发表于 2020-10-12 08:37
0xff是多余的 还是错误的啊

读一个字节,数据是对的。用官方的HAL库停止位函数,就会多出一个0xff,
自己写一句停止位寄存器操作,就正常。

使用特权

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

本版积分规则

9

主题

35

帖子

3

粉丝