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.

[参考译文] MSP432P401R:I2C 工作但速度非常慢(122.5Hz)

Guru**** 2578855 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/611568/msp432p401r-i2c-working-but-very-slow-122-5-hz

器件型号: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
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 其中一个愚蠢的错误。 在 INIT 函数中、我一直为 i2cClk 分配 B1、而不是 B2或 B3
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您分享您的调查结果、如果您遇到任何其他问题、请告知我们。

    此致、

    David