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.

[参考译文] MSP430FR2475:I2C 总线忙

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/968148/msp430fr2475-i2c-always-busy

器件型号:MSP430FR2475

大家好、在我使用"EUSCI_B_I2C_ENABLE (EUSCI_B1_BASE)"启用 I2C 后、UCBxSTATW 中的 BUSY 位始终置1;我是否做错了?

我在 SDA 和 SCL 上有10k 上拉电阻器,我测量了它们,它们都是高电平。

还尝试发送"HWREG16 (EUSCI_B1_BASE + OFS_UCBxCTLW0)|= UCTXSTP;"的停止

void Inicializacion (void)
{
WDT_A_HOLD (WDT_A_base);
//Configuracion DCO Con FLL、12MHz ////////////////////////////////////////////////////////////////////////
//可用于存储当前时钟值的变量
uint32_t clockValue = 0;
//设置 DCO FLL 基准= REFO
CS_initClockSignal (CS_FLLREF、CS_REFOCLK_select、CS_Clock_divider);
//设置 ACLK = REFO
CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_Clock_divider);
//设置比率和所需的 MCLK 频率并初始化 DCO
CS_initFLSettle (CS_MCLK_frequised_in_kHz、CS_MCLK_FLLREF_Ratio);//12MHz


执行{
//如果在超时后仍然无法清除振荡器故障标志,
//在此处捕获并等待。
clockValue = CS_clearAllOscFlagsWithTimeout (1000);
} while (clockValue!= 0);
//clockValue = CS_getSMCLK ();//调试

GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、I2CSCL、GPIO_primary_module_function);
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、I2CSDA、 GPIO_PRIMARY_MODULE_FUNCTION);


PMM_unlockLPM5 ();


//I2C 400kbps ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = CS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
param.byteCounterThreshold = 0;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
//__delay_cycles (500);
EUSCI_B_I2C_initMaster (EUSCI_B1_base、&param);
//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B1_BASE、SLAVE_ADDRESS);
//将主设备设置为接收模式
EUSCI_B_I2C_setMode (EUSCI_B1_BASE、EUSCI_B_I2C_Transmit 模式);
//启用 I2C 模块以启动操作
EUSCI_B_I2C_ENABLE (EUSCI_B1_BASE);

_bis_SR_register (GIE); //启用中断

//init TLC
while (EUSCI_B_I2C_isBusy (EUSCI_B1_BASE));//调试

} 

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

    要在 P4引脚上使用 I2C、您需要设置 USCIB1RMP;否则它们位于 P3上。 [参考数据表(SLASEO7B)表6-11和用户指南(SLAU445I)表1-32]

    我看不到 driverlib 函数来执行此操作、因此只需添加如下内容:

    >SYSCFG3 |= USCIB1RMP;  // P4引脚上的点 UCB1、而不是 P3引脚

    [编辑:关于单独的主题:如果您真的要设置 MCLK = 12MHz、则需要设置 FRAM 等待状态。 基于 driverlib 源(framctl.c)、如下所示:

    >FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCLESS_1);//对于12MHz 时钟、NWAITS=1

    ]

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

    现在它已经开始工作了! 谢谢!