请问CH32V00X中的I2C能不能像STM32进行封装,我尝试根据例程封装发现有问题,请问能否协助封装下

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空闲状态


    I2C_GenerateSTART(I2C1, ENABLE);  // 发送START信号


    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  // 等待I2C进入主模式


    I2C_Send7bitAddress(I2C1, devAddr, I2C_Direction_Receiver);  // 系统控制读写位


    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  // 等待进入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);  // 系统控制读写位


    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);  // 系统控制读写位


    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);  // 系统控制读写位


    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都有提供标准的库函数,在使用时直接调用库函数即可。此外,关于IIC读写,EVT有提供IIC读写EEPROM的例程,里面的读写函数可以参考一下。关于EVT下载链接如下:

https://www.wch.cn/downloads/CH32V003EVT_ZIP.html

https://www.wch.cn/downloads/CH32V006EVT_ZIP.html

 




主要是我确实是用了你们EEPROM的例程移植成这样,但是发现我这样不行,而且我不知道哪里错了,调了很久。

请您根据一个简单的API指点一下,然后最后我把全部正确的贴在这里,谢谢啦


您好,可以参考一下下帖第四部分介绍的连续读写的方法,基本是一样的

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

 


首先,不存在什么“STM32封装”,那是软件运行库,别和硬件混为一谈。

然后,不论是STM32还是沁恒,I2C的例子都只是极其基础的。如果你要写出健壮的I2C代码,超时是必须考虑的,否则总线就有被挂起的可能,导致后续无法操作。

最后,你自己的问题不可能不清楚吧?可看到最后我也不明白你到底是想问什么?你要关心的是顶层的功能,比如如何正确读写EEPROM,而不是什么“STM32封装”。也就是说,你实际遇到的问题根本没有提,反而自己想到一个不切实际的解决方案并希望别人帮你实现它。


谢谢梦珂0123的回答,不过你知道我要什么,但不愿意回答而且指责,没必要


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