This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G1106:I2C 待机循环

Guru**** 2386610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1410157/mspm0g1106-i2c-stand-loop

器件型号:MSPM0G1106

工具与软件:

在下面的代码行中、我可以读取 DS1307时间芯片、不会出现任何问题、但在处理器发生任何挂起或突然复位的情况下、(DL_I2C_isControllerRXFIFOEMpty (I2C_INST))、它会在函数内等待、这样会停止我的系统。 在这种情况下、您会建议使用什么软件方案?

uint8_t readDS1307Register(uint8_t regAddr) {
    uint8_t data;


    DL_I2C_fillControllerTXFIFO(I2C_INST, &regAddr, 1);

       /* Wait for I2C to be Idle */
       while (!(
           DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
           ;

       /* Send the packet to the controller.
        * This function will send Start + Stop automatically.
        */
       DL_I2C_startControllerTransfer(I2C_INST, DS1307_ADDRESS,
           DL_I2C_CONTROLLER_DIRECTION_TX, 1);

       /* Trap if there was an error */
       if (DL_I2C_getControllerStatus(I2C_INST) &
           DL_I2C_CONTROLLER_STATUS_ERROR) {
           /* LED will remain high if there is an error */
           __BKPT(0);
       }

       /* Wait for I2C to be Idle */
       while (!(
           DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
           ;

       /* Add delay between transfers */
       delay_cycles(100);

       /* Send a read request to Target */
       DL_I2C_startControllerTransfer(I2C_INST, DS1307_ADDRESS,
           DL_I2C_CONTROLLER_DIRECTION_RX, 1);




    while (DL_I2C_isControllerRXFIFOEmpty(I2C_INST));
    data = DL_I2C_receiveControllerData(I2C_INST);


    if (DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_ERROR) {
        printf("I2C Okuma Hatasi!\n");
    }

    return bcdToDec(data);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    系统复位可能会中断 i2c 写入命令传输进度、从而导致 i2c 目标器件无法响应 i2c 控制器。  

    2.避免程序在   while (DL_I2C_isControllerRXFIFOEMpty(I2C_INST)中阻塞  超时 可以在这个问题中使用参数。 下面是一个参考示例:

    int i2c_read(I2C_Regs *i2c, uint32_t targetAddr, uint8_t *buffer, uint16_t length, uint32_t timeOut)
    {
        /* Wait for I2C to be Idle */
        while (!(
            DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_IDLE))
            ;
    
        /* Send a read request to Target */
        DL_I2C_startControllerTransfer(i2c, targetAddr,
            DL_I2C_CONTROLLER_DIRECTION_RX, length);
    
        /*
         * Receive all bytes from target. LED will remain high if not all bytes
         * are received
         */
        for (uint8_t i = 0; i < length; i++) {
            uint32_t tmpCnt = timeOut;
            while (DL_I2C_isControllerRXFIFOEmpty(i2c)){
                tmpCnt --;
                /* Receiving time out */
                if (tmpCnt == 0)
                    return -1;
            }
            buffer[i] = DL_I2C_receiveControllerData(i2c);
        }
    
        return 0;
    }

    此致、

    Pengfei