CH32V103 的 I2C 示例代碼 是接收單字節(jié),如何改造成接收2字節(jié)和多字節(jié)的?

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

* 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);? ? // 接收多個字節(jié),必須開啟ACK

??

? ? u8 len=1;? ?// 要接收的字節(jié)數(shù),可以是1或多個,可自己傳參數(shù)修改。

? ? u8 rlen;

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

? ? {

? ? ? ? if(len == 1+rlen)

? ? ? ? {

? ? ? ? ? ? I2C_AcknowledgeConfig(I2C1, DISABLE);? // 若是最后一個字節(jié) ,必須用 NAK

? ? ? ? ? ? (void)I2C1->STAR2;

? ? ? ? ? ? I2C_GenerateSTOP(I2C1, ENABLE);

? ? ? ? }

? ? ? ? // 主機接收到數(shù)據(jù)事件EV7

? ? ? ? while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));

? ? ? ? *pBuffer? = I2C_ReceiveData(I2C1);? ?// 接收的多個字節(jié)放到數(shù)組緩存里

? ? ? ? pBuffer++;

? ? }



只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频