CH32V103 的 I2C 示例代码 是接收单字节,如何改造成接收2字节和多字节的?

/*******************************************************************************

* Function Name  : AT24CXX_Init   

* Description    : Initializes AT24xx EEPROM. 

* Input          : None

* Return         : None

********************************************************************************/

void AT24CXX_Init(void)

{

IIC_Init( 100000, 0xA0);

}


/*******************************************************************************

* Function Name  : AT24CXX_ReadOneByte   

* Description    : Read one data from EEPROM. 

* Input          : ReadAddr: Read frist address.

* Return         : temp: Read data.

********************************************************************************/

u8 AT24CXX_ReadOneByte(u16 ReadAddr)

{

u8 temp=0;


while( I2C_GetFlagStatus( I2C1, I2C_FLAG_BUSY ) != RESET );

I2C_GenerateSTART( I2C1, ENABLE );


while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) );  

I2C_Send7bitAddress( I2C1, 0XA0, I2C_Direction_Transmitter );


while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) ); 

#if (Address_Lenth  == Address_8bit)

I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );  

#elif (Address_Lenth  == Address_16bit)

I2C_SendData( I2C1, (u8)(ReadAddr>>8) );   

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); 

I2C_SendData( I2C1, (u8)(ReadAddr&0x00FF) );  

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); 

#endif

I2C_GenerateSTART( I2C1, ENABLE );

while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_MODE_SELECT ) ); 

I2C_Send7bitAddress( I2C1, 0XA0, I2C_Direction_Receiver );


while( !I2C_CheckEvent( I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ) );   

 

  while( I2C_GetFlagStatus( I2C1, I2C_FLAG_RXNE ) ==  RESET )

I2C_AcknowledgeConfig( I2C1, DISABLE );---------------改为ENABLE,不行,,


temp = I2C_ReceiveData( I2C1 );

                                                             --------------视乎这里还要添加代码,但不知如何写。。。。

  I2C_GenerateSTOP( I2C1, ENABLE );


return temp;

}

------------------


哪为高手做过,给个示例代码参考。。。谢谢。

https://blog.csdn.net/weixin_46567262/article/details/106688646

可以参考下上面链接的处理方法


搞定了。。把最后while 那句改成:
   

    I2C_AcknowledgeConfig(I2C1, ENABLE);    // 接收多个字节,必须开启ACK

  

    u8 len=1;   // 要接收的字节数,可以是1或多个,可自己传参数修改。

    u8 rlen;

    for(rlen = 0; rlen < len; rlen++)

    {

        if(len == 1+rlen)

        {

            I2C_AcknowledgeConfig(I2C1, DISABLE);  // 若是最后一个字节 ,必须用 NAK

            (void)I2C1->STAR2;

            I2C_GenerateSTOP(I2C1, ENABLE);

        }

        // 主机接收到数据事件EV7

        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));

        *pBuffer  = I2C_ReceiveData(I2C1);   // 接收的多个字节放到数组缓存里

        pBuffer++;

    }



只有登录才能回复,可以选择微信账号登录