我将进入勘误表 EUSCI43。 在勘误表的第一个解决方案中、它说可以通过使用同步时钟源来避免使用 EUSCI43。 我不确定这意味着什么或如何设置它。 我具有以下时钟配置:
MAP_CS_setDCOFrequency (CLK_FQ);//将 DCO (时钟)设置为指定的时钟速度 MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK _DIVIDER_1);//将 SMCLK 连接到 DCO MAP_CS_initClockSignal (CS_ACLK、CS_VLOCLK_SELECT、CS_Clock_divider _1);//将 ACLK 连接到 VLO
CLK_FQ = 80000
我在 I2C 配置中也具有此功能:
// I2C 主配置参数 const eUSCI_I2C_MasterConfig ACCEL_i2cConfig = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 80000、 // SMCLK = 8MHz EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的100kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_NO_AUTO_STOP //无自动停止 };
什么是同步时钟源、如何设置一个?
EUSCI43规定:
轮询 UCBxRXIFG 时通信停止
将 USCI_B I2C 模块用作接收器时、如果在读取 UCBxRXIFG 中断标志期间发生异步事件、则该标志可能会被意外清除。 这可能会导致 I2C 通信停止。
权变措施1. 如果器件用作 I2C 主接收器、则使用同步时钟源进行操作。
或2. 避免轮询 UCBxRXIFG。 使用标准中断服务例程来处理 UCBxRXIFG 中断标志可显著降低此勘误表的发生概率。 避免寄存器访问 UCBxCTLW0、UCBxSTATW、UCBxRXBUF、UCBxTXBUF、UCBxIFG、 和 UCBxIV、同时发送或接收操作正在进行、UCBxRXIFG 或 UCBxTXIFG 预计会被置位。
或3. 使用时钟低电平超时选择功能(UCCTLO.UCBxCTLW1)来启用一个超时窗口。 如果 I2C 通信被挂起、使用时钟低电平超时中断来复位 eUSCI 模块并重新启动通信。