请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432P401R 我的 I2C 配置有一个奇怪的问题。 运行速度真的很慢! 它按预期工作、但不能达到预期速度。 其时钟为122.5hz。 我的 SMCLK 读数为8、005、653 Hz。 如果我将 DCO tripple my I2C clock 更改为~368hz (122.5*3)。 我的代码和时钟设置如下所示。 我希望我的时钟设置方式会出现问题。 我用示波器来测量它、没有注意到任何鲨鱼鳍状结构。 I2C 电阻器(4.7K)就位。
时钟配置
//配置时钟 /*为外设/晶体使用配置引脚、为输出配置 LED */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、 GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_FUNCTION); /*设置外部时钟频率。 此 API 是可选的、但会是可选的 *如果用户想使用 getMCLK/getACLK/etc、就来方便 函数 * cs_setExternalClockSourceFrequency (32768、25000000); /*在非旁路模式下启动 LFXT 而不超时。 * CS_startLFXT (CS_LFXT_DRIVE3); MAP_CS_setDCOFrequency (8000000);//将 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
I2C 驱动器
// // //版权所有(C) 2014德州仪器(TI)公司- http://www.ti.com/ // 重新分发和使用源码和二进制格式,无论是否 进行//修改,只要 满足以下条件//即可: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //// ************* //******** MODIFICATON 信息********* //Modified from original source located at :// e2e.ti.com/.../1701554 ///// / Reid Kersey Modfeeded by Reid Kersey,CEO,Sniffer GPS - 6/7/2017 // sniffergps.com // reid@sniffergps.com // 678-209-2215 // ////更新: //将 EUSCI_Bx_MODULE 更改为 EUSCI_Bx_BASE //从使用 B1更改为允许使用任何 Bx 模块 //添加了函数说明注释 //可以随时与我联系以了解对本代码的修改或有关使用的问题, //但是我不是原始作者。 优惠券可用于 DavidL e2e.ti.com/.../2005340 #include #include #include "msp432.h" #include "i2c_driver.h" #include "driverlib.h" //********* //// 定义 // //********* // // //全局数据 // //********* 易失性 eUSCI_STATUS ui8Status; uint8_t * pData; uint8_t ui8DummyRead; uint32_t g_ui32ByteCount; bool BurstMode = false; //B0-3配置 /* I2C 主配置参数* / volatile eUSCI_I2C_MasterConfig i2cConfig_B0 = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 0、 EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的400kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_SEND_STOP_INALOCK_BYTECOUNT_T_THRESHOLD //自动停止 }; 易失性 eUSCI_I2C_MasterConfig i2cConfig_B1 = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 0、 EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的400kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_SEND_STOP_INALOCK_BYTECOUNT_T_THRESHOLD //自动停止 }; 易失性 eUSCI_I2C_MasterConfig i2cConfig_B2 = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 0、 EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的400kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_SEND_STOP_INALOCK_BYTECOUNT_T_THRESHOLD //自动停止 }; 易失性 eUSCI_I2C_MasterConfig i2cConfig_B3 = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 0、 EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的400kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_SEND_STOP_INALOCK_BYTECOUNT_T_THRESHOLD //自动停止 }; //********* //// 导入的数据 // //********* // // //常量 // //********* // // //函数原型 // //********* /************* 函数: 您必须在执行任何读取或写入操作之前调用此函数 @param 模块 EUSCI 模块使用的示例:eUSCI_B0_BASE */ void initI2C (int 模块) { /* I2C 时钟同步速度*/ if (module == EUSCI_B0_BASE){ i2cConfig_B0.i2cClk = MAP_CS_getSMCLK (); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P1、GPIO_PIN6 | GPIO_PIN7、 GPIO_PRIMARY_MODULE_FUNCTION); /*使用自动停止将 I2C 主设备初始化为 SMCLK 100kbs */ MAP_I2C_initMaster (EUSCI_B0_BASE、&i2cConfig_B0); }else if (module =EUSCI_B1_base){ i2cConfig_B1.i2cClk = MAP_CS_getSMCLK (); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P6、GPIO_PIN5 | GPIO_PIN4、 GPIO_PRIMARY_MODULE_FUNCTION); /*使用自动停止将 I2C 主设备初始化为 SMCLK 100kbs */ MAP_I2C_initMaster (EUSCI_B1_base、&i2cConfig_B1); }else if (module =EUSCI_B2_base){ i2cConfig_B1.i2cClk = MAP_CS_getSMCLK (); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN6 | GPIO_PIN7、 GPIO_PRIMARY_MODULE_FUNCTION); /*使用自动停止将 I2C 主设备初始化为 SMCLK 100kbs */ MAP_I2C_initMaster (EUSCI_B2_base、&i2cConfig_B2); }else if (module =EUSCI_B3_base){ i2cConfig_B1.i2cClk = MAP_CS_getSMCLK (); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P6、GPIO_PIN6 | GPIO_PIN7、 GPIO_secondary 模块功能); /*使用自动停止将 I2C 主设备初始化为 SMCLK 100kbs */ MAP_I2C_initMaster (EUSCI_B3_base、&i2cConfig_B3); } } /********* @:Δ Σ param 模块要使用的 EUSCI 模块、例如: eUSCI_B0_BASE @param ui8Addr 模块 的7位地址@param ui8Reg 要写入 @param Data 要写入数据的存储位置的寄存器 @param ui32ByteCount 要写入的字节数 @如果成功则返回 true、否则 */ bool writeI2C (module、uint8uintr uint8 uintr uint8_t ui8Reg、uint8_t *数据、uint8_t ui8ByteCount) { /*等待写入准备就绪*/ while (MAP_I2C_isBusBusy (MODULE)); /*将数据分配给本地指针*/ pData =数据; /*禁用 I2C 模块进行更改*/ MAP_I2C_disableModule (MODULE); /*设置要发送的字节数+ 1以考虑寄存器字节*/ if (module == EUSCI_B0_BASE){ i2cConfig_B0.byteCounterThreshold = ui8ByteCount + 1; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B0); }else if (module =EUSCI_B1_base){ i2cConfig_B1.byteCounterThreshold = ui8ByteCount + 1; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B1); }else if (module =EUSCI_B2_base){ i2cConfig_B2.byteCounterThreshold = ui8ByteCount + 1; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B2); }else if (module =EUSCI_B3_base){ i2cConfig_B3.byteCounterThreshold = ui8ByteCount + 1; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B3); }否则{ 返回 false; } /*加载设备从地址*/ MAP_I2C_setSlaveAddress (MODULE、ui8Addr); /*启用 I2C 模块以启动操作*/ MAP_I2C_enableModule (MODULE); /*启用主器件停止、TX 和 NACK 中断*/ MAP_I2C_enableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0); /*将我们的本地状态设置为 BUSY */ ui8Status = eUSCI_BUSY; /*发送起始位和寄存器*/ MAP_I2C_masterSendMultiByteStart (MODULE、ui8Reg); /*为剩余数据启用主中断*/ if (module == EUSCI_B0_BASE){ MAP_Interrupt_enableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } //现在等待要发送的数据字节 while (ui8Status = eUSCI_BUSY) { #ifdef use_LPM MAP_PCM_gotoLPM0 (); #else __no_operation(); #endif } /*禁用中断*/ MAP_I2C_DisableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT + EUSCI_B_I2C_Transmit INTERRUPT0); if (module == EUSCI_B0_BASE){ MAP_Interrupt_disableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } if (ui8Status = eUSCI_NACK) { return (false); } 其他 { return (true); } } /********* @: @param 模块 EUSCI 模块使用的示例:eUSCI_B0_BASE @param ui8Addr 模块的7位地址@param ui8Reg 要从@param Data 读取的寄存 器指向放置数据的位置的指针@param ui32ByteCount 要读取的字节数如果成功则返回 true、 false、否则 */ bool readI2C (int 模块、uint8_t ui8Addr、uint8_t ui8Reg、uint8_t *数据、uint8_t ui8ByteCount) { /*待办事项:设置延迟*/ //TODO 在忙了足够长的时间时复位 /*等待就绪*/ while (MAP_I2C_isBusBusy (MODULE)); /*将数据分配给本地指针*/ pData =数据; /*禁用 I2C 模块进行更改*/ MAP_I2C_disableModule (MODULE); /*设置要接收的字节数*/ if (module == EUSCI_B0_BASE){ i2cConfig_B0.byteCounterThreshold = ui8ByteCount; i2cConfig_B0.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B0); }else if (module =EUSCI_B1_base){ i2cConfig_B1.byteCounterThreshold = ui8ByteCount; i2cConfig_B1.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B1); }else if (module =EUSCI_B2_base){ i2cConfig_B2.byteCounterThreshold = ui8ByteCount; i2cConfig_B2.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B2); }else if (module =EUSCI_B3_base){ i2cConfig_B3.byteCounterThreshold = ui8ByteCount; i2cConfig_B3.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B3); }否则{ 返回 false; } /*加载设备从地址*/ MAP_I2C_setSlaveAddress (MODULE、ui8Addr); /*启用 I2C 模块以启动操作*/ MAP_I2C_enableModule (MODULE); /*启用主器件停止和 NACK 中断*/ MAP_I2C_enableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT); /*将我们的本地状态设置为 BUSY */ ui8Status = eUSCI_BUSY; /*发送起始位和寄存器*/ MAP_I2C_masterSendMultiByteStart (MODULE、ui8Reg); /*为剩余数据启用主中断*/ if (module == EUSCI_B0_BASE){ MAP_Interrupt_enableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } /*注意:如果要接收的字节数= 1、则随着目标寄存器被移位 * OUT 在写入阶段、UCBxTBCNT 将被计数并过早触发停止位 *如果 count > 1、则等待下一个 TXBUF 空中断(恰好在寄存器值之后) *移出 * *如果您的代码卡在这里、您可能会从中断调用此函数 *不要这样做! * while (ui8Status = eUSCI_BUSY) { IF (MAP_I2C_getInterruptStatus (MODULE、EUSCI_B_I2C_Transmit、INTERRUPT0)) { ui8Status = eUSCI_IDLE; } } ui8Status = eUSCI_BUSY; /*关闭 TX 并生成重新启动*/ MAP_I2C_masterReceiveStart (模块); /*启用 RX 中断*/ MAP_I2C_enableInterrupt (MODULE、EUSCI_B_I2C_Receive_INTERRUPT0); /*等待接收所有数据*/ while (ui8Status = eUSCI_BUSY) { #ifdef use_LPM MAP_PCM_gotoLPM0 (); #else __no_operation(); #endif } /*禁用中断*/ MAP_I2C_DisableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT + EUSCI_B_I2C_Receive_INTERRUPT0); if (module == EUSCI_B0_BASE){ MAP_Interrupt_disableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } if (ui8Status = eUSCI_NACK) { return (false); } 其他 { return (true); } } /********* @: @param 模块 EUSCI 模块使用的示例:eUSCI_B0_BASE @param ui8Addr 模块的7位地址@param ui8Reg 要从@param Data 读取的寄存 器指向放置数据的位置的指针@param ui32ByteCount 要读取的字节数如果成功则返回 true、 false、否则 */ bool readBurstI2C (int module、uint8_t ui8Addr、uint8_t ui8Reg、uint8_t *数据、uint32_t ui32ByteCount) { /*待办事项:设置延迟*/ /*等待就绪*/ while (MAP_I2C_isBusBusy (MODULE)); /*将数据分配给本地指针*/ pData =数据; /*禁用 I2C 模块进行更改*/ MAP_I2C_disableModule (MODULE); /*设置要接收的字节数*/ if (module == EUSCI_B0_BASE){ i2cConfig_B0.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; G_ui32ByteCount = ui32ByteCount; BurstMode = true; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B0); }else if (module =EUSCI_B1_base){ i2cConfig_B0.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; G_ui32ByteCount = ui32ByteCount; BurstMode = true; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B1); }else if (module =EUSCI_B2_base){ i2cConfig_B0.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; G_ui32ByteCount = ui32ByteCount; BurstMode = true; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B2); }else if (module =EUSCI_B3_base){ i2cConfig_B0.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; G_ui32ByteCount = ui32ByteCount; BurstMode = true; MAP_I2C_initMaster (MODULE、(CONST eUSCI_I2C_MasterConfig *)&i2cConfig_B3); }否则{ 返回 false; } /*加载设备从地址*/ MAP_I2C_setSlaveAddress (MODULE、ui8Addr); /*启用 I2C 模块以启动操作*/ MAP_I2C_enableModule (MODULE); /*启用主器件停止和 NACK 中断*/ MAP_I2C_enableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT); /*将我们的本地状态设置为 BUSY */ ui8Status = eUSCI_BUSY; /*发送起始位和寄存器*/ MAP_I2C_masterSendMultiByteStart (MODULE、ui8Reg); /*为剩余数据启用主中断*/ if (module == EUSCI_B0_BASE){ MAP_Interrupt_enableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_enableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } /*注意:如果要接收的字节数= 1、则随着目标寄存器被移位 * OUT 在写入阶段、UCBxTBCNT 将被计数并过早触发停止位 *如果 count > 1、则等待下一个 TXBUF 空中断(恰好在寄存器值之后) *移出 * *如果您的代码卡在这里、您可能会从中断调用此函数 *不要这样做! * while (ui8Status = eUSCI_BUSY) { IF (MAP_I2C_getInterruptStatus (MODULE、EUSCI_B_I2C_Transmit、INTERRUPT0)) { ui8Status = eUSCI_IDLE; } } ui8Status = eUSCI_BUSY; /*关闭 TX 并生成重新启动*/ MAP_I2C_masterReceiveStart (模块); /*启用 RX 中断*/ MAP_I2C_enableInterrupt (MODULE、EUSCI_B_I2C_Receive_INTERRUPT0); /*等待接收所有数据*/ while (ui8Status = eUSCI_BUSY) { #ifdef use_LPM MAP_PCM_gotoLPM0 (); #else __no_operation(); #endif } /*禁用中断*/ MAP_I2C_DisableInterrupt (模块、EUSCI_B_I2C_STOP_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT + EUSCI_B_I2C_Receive_INTERRUPT0); if (module == EUSCI_B0_BASE){ MAP_Interrupt_disableInterrupt (INT_EUSCIB0); }else if (module =EUSCI_B1_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB1); }else if (module =EUSCI_B2_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB2); }else if (module =EUSCI_B3_base){ MAP_Interrupt_disableInterrupt (INT_EUSCIB3); }否则{ 返回 false; } if (ui8Status = eUSCI_NACK) { return (false); } 其他 { return (true); } } /********* 函数:euscib0IntHandler */ void euscib0IntHandler (void) { uint_fast16_t status; STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B0_BASE); MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、STATUS); IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT) { /*在从器件发生 Nacks 时生成 STOP */ MAP_I2C_masterSendMultiByteStop (EUSCI_B0_BASE); /*清除所有挂起的 TX 中断*/ MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0); /*将我们的本地状态设置为 NACK Received */ ui8Status = eUSCI_NACK ;} IF (STATUS & EUSCI_B_I2C_START_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_START; } IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_STOP; } IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0) { /* RX 数据*/ *pData++= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE); ui8DummyRead= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE); IF (BurstMode) { g_ui32字节计数--; if (g_ui32ByteCount = 1) { BurstMode = false; /*生成停止*/ MAP_I2C_masterSendMultiByteStop (EUSCI_B0_BASE); } } IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0) { /*发送下一个数据*/ MAP_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、*pData++); } #ifdef USE_LPM MAP_Interrupt_disableSlepOnIsrExit(); #endif } void euscib1IntHandler (void) { uint_fast16_t status; STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B1_BASE); MAP_I2C_clearInterruptFlag (EUSCI_B1_BASE、STATUS); IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT) { /*在从器件发生 Nacks 时生成 STOP */ MAP_I2C_masterSendMultiByteStop (EUSCI_B1_BASE); /*清除所有挂起的 TX 中断*/ MAP_I2C_clearInterruptFlag (EUSCI_B1_BASE、EUSCI_B_I2C_Transmit、INTERRUPT0); /*将我们的本地状态设置为 NACK Received */ ui8Status = eUSCI_NACK ;} IF (STATUS & EUSCI_B_I2C_START_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_START; } IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_STOP; } IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0) { /* RX 数据*/ *pData++= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B1_BASE); ui8DummyRead= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B1_BASE); IF (BurstMode) { g_ui32字节计数--; if (g_ui32ByteCount = 1) { BurstMode = false; /*生成停止*/ MAP_I2C_masterSendMultiByteStop (EUSCI_B1_BASE); } } IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0) { /*发送下一个数据*/ MAP_I2C_masterSendMultiByteNext (EUSCI_B1_base、* pData++); } #ifdef USE_LPM MAP_Interrupt_disableSlepOnIsrExit(); #endif } void euscib2IntHandler (void) { uint_fast16_t status; STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B2_BASE); MAP_I2C_clearInterruptFlag (EUSCI_B2_base、status); IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT) { /*在从器件发生 Nacks 时生成 STOP */ MAP_I2C_masterSendMultiByteStop (EUSCI_B2_base); /*清除所有挂起的 TX 中断*/ MAP_I2C_clearInterruptFlag (EUSCI_B2_base、EUSCI_B_I2C_Transmit、INTERRUPT0); /*将我们的本地状态设置为 NACK Received */ ui8Status = eUSCI_NACK ;} IF (STATUS & EUSCI_B_I2C_START_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_START; } IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_STOP; } IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0) { /* RX 数据*/ *pData++= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B2_base); ui8DummyRead= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B2_base); IF (BurstMode) { g_ui32字节计数--; if (g_ui32ByteCount = 1) { BurstMode = false; /*生成停止*/ MAP_I2C_masterSendMultiByteStop (EUSCI_B2_base); } } IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0) { /*发送下一个数据*/ MAP_I2C_masterSendMultiByteNext (EUSCI_B2_base、* pData++); } #ifdef USE_LPM MAP_Interrupt_disableSlepOnIsrExit(); #endif } void euscib3IntHandler (void) { uint_fast16_t status; STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B3_base); MAP_I2C_clearInterruptFlag (EUSCI_B3_base、status); IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT) { /*在从器件发生 Nacks 时生成 STOP */ MAP_I2C_masterSendMultiByteStop (EUSCI_B3_base); /*清除所有挂起的 TX 中断*/ MAP_I2C_clearInterruptFlag (EUSCI_B3_base、EUSCI_B_I2C_Transmit、INTERRUPT0); /*将我们的本地状态设置为 NACK Received */ ui8Status = eUSCI_NACK ;} IF (STATUS & EUSCI_B_I2C_START_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_START; } IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT) { /*更改我们的本地状态*/ ui8Status = eUSCI_STOP; } IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0) { /* RX 数据*/ *pData++= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B3_base); ui8DummyRead= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B3_base); IF (BurstMode) { g_ui32字节计数--; if (g_ui32ByteCount = 1) { BurstMode = false; /*生成停止*/ MAP_I2C_masterSendMultiByteStop (EUSCI_B3_base); } } IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0) { /*发送下一个数据*/ MAP_I2C_masterSendMultiByteNext (EUSCI_B3_base、* pData++); } #ifdef USE_LPM MAP_Interrupt_disableSlepOnIsrExit(); #endif }