本帖最后由 DebugLab 于 2024-11-21 13:50 编辑
我使用软件I2C可以,但是查硬件I2C一直没找到问题,这里咨询一下,谢谢大家
按顺序核心代码如下:
- P3PU = 0x0d; // P30(RxD),P32(SCL),P33(SDA)上拉
- P3M0 = 0x0f; // 设置P30,P31(TxD)准双向,P32,P33开漏输出
- P3M1 = 0x03; // 设置P30,P31(TxD)准双向,P32,P33开漏输出
复制代码
下面是我抄的官方库并进行函数名修改,其他什么也没动:
-
- uint8_t i2cGetMsBusyStatus(void) {
- return (I2CMSST & 0x80);
- }
-
- void i2cWait() {
- while (!(I2CMSST & 0x40));
- I2CMSST &= ~0x40;
- }
-
- void i2cStart() {
- I2CMSCR = 0x01; // 发送START命令
- i2cWait();
- }
-
- void i2cSendData(char dat) {
- I2CTXD = dat; // 写数据到数据缓冲区
- I2CMSCR = 0x02; // 发送SEND命令
- i2cWait();
- }
-
- void i2cRecvACK() {
- I2CMSCR = 0x03; // 发送读ACK命令
- i2cWait();
- }
-
- char i2cRecvData() {
- I2CMSCR = 0x04; // 发送RECV命令
- i2cWait();
- return I2CRXD;
- }
-
- void i2cSendACK() {
- I2CMSST = 0x00; // 设置ACK信号
- I2CMSCR = 0x05; // 发送ACK命令
- i2cWait();
- }
-
- void i2cSendNAK() {
- I2CMSST = 0x01; // 设置NAK信号
- I2CMSCR = 0x05; // 发送ACK命令
- i2cWait();
- }
-
- void i2cStop() {
- I2CMSCR = 0x06; // 发送STOP命令
- i2cWait();
- }
-
- void i2cSendCmdData(uint8_t cmd, uint8_t dat) {
- I2CTXD = dat; // 写数据到数据缓冲区
- I2CMSCR = cmd; // 设置命令
- i2cWait();
- }
-
- void i2cWriteNbyte(uint8_t dev_addr, uint8_t mem_addr, uint8_t *p, uint8_t number) {
- i2cStart(); // 发送起始命令
- i2cSendData(dev_addr); // 发送设备地址+写命令
- i2cRecvACK();
- i2cSendData(mem_addr); // 发送存储地址
- i2cRecvACK();
- do {
- i2cSendData(*p++);
- i2cRecvACK();
- } while (--number);
- i2cStop(); // 发送停止命令
- }
-
- void i2cReadNbyte(uint8_t dev_addr, uint8_t mem_addr, uint8_t *p, uint8_t number) {
- i2cStart(); // 发送起始命令
- i2cSendData(dev_addr); // 发送设备地址+写命令
- i2cRecvACK();
- i2cSendData(mem_addr); // 发送存储地址
- i2cRecvACK();
- i2cStart(); // 发送起始命令
- i2cSendData(dev_addr | 1); // 发送设备地址+读命令
- i2cRecvACK();
- do {
- *p = i2cRecvData();
- p++;
- if (number != 1) i2cSendACK(); // send ACK
- } while (--number);
- i2cSendNAK(); // send no ACK
- i2cStop(); // 发送停止命令
- }
复制代码
之后我在初始化的基础上调用了i2cReadNbyte或i2cWriteNbyte会导致系统卡死,不知道什么原因。
|