請(qǐng)問CH32V00X中的I2C能不能像STM32進(jìn)行封裝,我嘗試根據(jù)例程封裝發(fā)現(xiàn)有問題,請(qǐng)問能否協(xié)助封裝下

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,uint16_tDevAddress,uint8_t*pData,


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uint16_tSize,uint32_tTimeout);


HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c,uint16_tDevAddress,uint8_t*pData,


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_tSize,uint32_tTimeout);


HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,uint16_tDevAddress,uint16_tMemAddress,


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uint16_tMemAddSize,uint8_t*pData,uint16_tSize,uint32_tTimeout);


HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c,uint16_tDevAddress,uint16_tMemAddress,


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?uint16_tMemAddSize,uint8_t*pData,uint16_tSize,uint32_tTimeout);




static int i2cMasterReadDevice(inti2cNum,uint8_tdevAddr,uint8_t*data,intdataSize) {


? ? while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET); ?// 等待I2C空閑狀態(tài)


? ? I2C_GenerateSTART(I2C1, ENABLE); ?// 發(fā)送START信號(hào)


? ? while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); ?// 等待I2C進(jìn)入主模式


? ? I2C_Send7bitAddress(I2C1, devAddr, I2C_Direction_Receiver); ?// 系統(tǒng)控制讀寫位


? ? while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); ?// 等待進(jìn)入I2C接收模式


? ? I2C_AcknowledgeConfig(I2C1, ENABLE);


? ? for (int i = 0; i < dataSize - 1; i++) {


? ? ? ? *data = I2C_ReceiveData(I2C1);


? ? ? ? data++;


? ? ? ? while (I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == SET);


? ? }


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


? ? ? ? I2C_AcknowledgeConfig(I2C1, DISABLE);


? ? }


? ? *data = I2C_ReceiveData(I2C1);


? ? I2C_GenerateSTOP(I2C1, ENABLE);


? ? return 0;


}


static int i2cMasterWriteDevice(inti2cNum,uint8_tdevAddr,uint8_t*data,intdataSize) {


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


? ? I2C_GenerateSTART(I2C1, ENABLE);


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


? ? I2C_Send7bitAddress(I2C1, devAddr, I2C_Direction_Transmitter); ?// 系統(tǒng)控制讀寫位


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


? ? for (int i = 0; i < dataSize - 1; i++) {


? ? ? ? I2C_SendData(I2C1, *data);


? ? ? ? data++;


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


? ? }


? ? if (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) != RESET) {


? ? ? ? I2C_SendData(I2C1, data);


? ? }


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


? ? I2C_GenerateSTOP(I2C1, ENABLE);


? ? return 0;


}


static int i2cMasterReadMemory(inti2cNum,uint8_tdevAddr,uint16_t*wRegData,intwRegDataSize,uint8_t*rData,intrDataSize) {


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


? ? I2C_GenerateSTART(I2C1, ENABLE);


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


? ? I2C_Send7bitAddress(I2C1, devAddr, I2C_Direction_Transmitter); ?// 系統(tǒng)控制讀寫位


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


? ? for (int i = 0; i < wRegDataSize; i++) {


? ? ? ? I2C_SendData(I2C1, *wRegData);


? ? ? ? wRegData++;


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


? ? }


? ? 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));


? ? for (int i = 0; i < rDataSize - 1; i++) {


? ? ? ? *rData = I2C_ReceiveData(I2C1);


? ? ? ? rData++;


? ? ? ? while (I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == SET);


? ? }


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


? ? ? ? I2C_AcknowledgeConfig(I2C1, DISABLE);


? ? }


? ? *rData = I2C_ReceiveData(I2C1);


? ? I2C_GenerateSTOP(I2C1, ENABLE);


? ? return 0;


}


static int i2cMasterWriteMemory(inti2cNum,uint8_tdevAddr,uint16_t*wRegData,intwRegDataSize,uint8_t*wData,intwDataSize) {


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


? ? I2C_GenerateSTART(I2C1, ENABLE);


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


? ? I2C_Send7bitAddress(I2C1, devAddr, I2C_Direction_Transmitter); ?// 系統(tǒng)控制讀寫位


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


? ? for (int i = 0; i < wRegDataSize; i++) {


? ? ? ? I2C_SendData(I2C1, *wRegData);


? ? ? ? wRegData++;


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


? ? }


? ? for (int i = 0; i < wDataSize - 1; i++) {


? ? ? ? I2C_SendData(I2C1, *wData);


? ? ? ? wData++;


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


? ? }


? ? if (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) != RESET) {


? ? ? ? I2C_SendData(I2C1, wData);


? ? }


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


? ? I2C_GenerateSTOP(I2C1, ENABLE);


? ? return 0;


}



您好,我們MCU都有提供標(biāo)準(zhǔn)的庫函數(shù),在使用時(shí)直接調(diào)用庫函數(shù)即可。此外,關(guān)于IIC讀寫,EVT有提供IIC讀寫EEPROM的例程,里面的讀寫函數(shù)可以參考一下。關(guān)于EVT下載鏈接如下:

http://m.findthetime.net/downloads/CH32V003EVT_ZIP.html

http://m.findthetime.net/downloads/CH32V006EVT_ZIP.html

?




主要是我確實(shí)是用了你們EEPROM的例程移植成這樣,但是發(fā)現(xiàn)我這樣不行,而且我不知道哪里錯(cuò)了,調(diào)了很久。

請(qǐng)您根據(jù)一個(gè)簡(jiǎn)單的API指點(diǎn)一下,然后最后我把全部正確的貼在這里,謝謝啦


您好,可以參考一下下帖第四部分介紹的連續(xù)讀寫的方法,基本是一樣的

https://www.cnblogs.com/Mount256/p/15146612.html

?


首先,不存在什么“STM32封裝”,那是軟件運(yùn)行庫,別和硬件混為一談。

然后,不論是STM32還是沁恒,I2C的例子都只是極其基礎(chǔ)的。如果你要寫出健壯的I2C代碼,超時(shí)是必須考慮的,否則總線就有被掛起的可能,導(dǎo)致后續(xù)無法操作。

最后,你自己的問題不可能不清楚吧?可看到最后我也不明白你到底是想問什么?你要關(guān)心的是頂層的功能,比如如何正確讀寫EEPROM,而不是什么“STM32封裝”。也就是說,你實(shí)際遇到的問題根本沒有提,反而自己想到一個(gè)不切實(shí)際的解決方案并希望別人幫你實(shí)現(xiàn)它。


謝謝夢(mèng)珂0123的回答,不過你知道我要什么,但不愿意回答而且指責(zé),沒必要


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

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