请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP432P401R 主题中讨论的其他部件:TCA9535, MSP430G2553
我尝试使用演示 bootxl_edumkII_lightSensor_msp432p401r从TCA9535读取数据,就像这样
const eUSI_I2C_MasterConfig i2cConfig =
{
EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
2400万, // SMCLK = 48MHz
EUSCI_B_I2C_SET_DATA_RATE_100KBPS, //所需的I2C时钟为100kHz
0, //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};
静态void TCA9535_Write(ST_TCA9535* a_pstTCA9535,9535 a_pstTCA9535, C_U89535 C_U8 a_u8RegAddr , C_U8 a_u8RegData){/*
指定
Interinterrupt address for I2C_setSlaveAddress(I2C_SCI_B3_base, a_pst_a_ut8 a_utr8_utr8_utb3_I2C_DEF_I2C_DEF_I2C_DEB3_STB3_STB3_STB3;
传输模式EDE_DE_DEF_I2C_DEB3_DEB3_DEF_EDEF_EDEB3_DEB3_DEB3_EDEF_I2I2I2I2C_DEF_I2C_DE_I2C_DEB3_DEB3_ST_DEB3_DEF_DEB3_
/*清除任何现有的中断标志PL */
I2C_clearInterruptFlag (EUSI_B3_BASE,
EUSI_B_I2C_Transmit_INTERRUPT0);
/*等待准备好写入PL */
while (I2C_isBusy (EUSI_B3_BASE));
/*启动启动并发送第一个字符*/
I2C_masterSendMultiByteStart(EUSI_B3_base,
a_u8RegAddr);
INTERSCI_MasterSendMultiByteFinish(EUSSCI_B3_base,
A_u8RegData);
}
静态void TCA9535_Read(ST_TCA9535* a_pstTCA9535,9535 a_pstTCA9535, C_U89535 C_U8 a_u8RegAddr , C_U8* a_u8RegData)
{/*
指定I2C */ I2C_INTERSTB3_ST_STB3_STREB3_EPT95B3_DE_DECAST_I2C_DELAST_I2B3_I2I2C_DE_I2C_DEAD_I2C_DE_I2C_DELA_I2B0,
INTER_I2B3_I2C_DELA_I2C_DE_I2C_DELA_I2C_DELA_I2B3_I2C_DE_I2B0_I2C_DE_I
/*将主中继器设置为传输模式PL */
I2C_setMode (EUSI_B3_BASE,
EUSCI_B_I2C_Transmit_mode);
/*清除任何现有中断标志PL */
I2C_clearInterruptFlag (EUSI_B3_BASE,
EUSCI_B_I2C_Transmit_INTERRUPT0);
/*等待准备好写入PL */
While (I2C_isBusBusy (EUSCI_B3_BASE));
/*启动开始并发送第一个字符*/
I2C_masterSendMultiByteStart (EUSCI_B3_base,a_u8RegAddr);
/*等待TX完成*/
while (!(I2C_getInterruptStatus (EUSCI_B3_BASE),
EUSCI_B_I2C_Transmit_INTERRUPT0));
/*仅启动停止*/
I2C_masterSendMultiByteStop (EUSI_B3_BASE);
/*
*生成启动条件并将其设置为接收模式。
*这将发送从属地址并继续读取
*直到您发出停止
*/
*a_u8RegData = I2C_masterReceiveSingleByte (EUSI_B3_base);
//I2C_masterReceiveStart (EUSCI_B3_BASE);
/*等待RX缓冲区填充*///
while (!(I2C_getInterruptStatus (EUSI_B3_BASE,
// EUSCI_B_I2C_Receive_INTERRUPT0));
/*接收第二个字节然后发送停止条件*//*a_u8RegData
= I2C_masterReceiveMultiByteFinish(EUSI_B3_base);
}
void TCA9535_Init(ST_TCA9535* a_pstTCA9535,9535 a_pstTCA9535, C_U89535 C_U8 a_u8DevAddr)
{
a_pstTCA9535->m_DevAddrW =(a_u8DevAddr <<1)| 0;// Addr + Write
a_pstTCA9535->m_DevAddrR =(a_u8DevAddr << 1)| 1;// Addr +读取
a_pstTCA9535->m_DevAddr = a_u8DevAddr;
GPIO_setAsPeripheralModuleFunctionOutputPin (
SCL_port,
SCL_PIN,
GPIO辅助模块功能);
GPIO_setAsPeripheralModuleFunctionOutputPin (
SDA_port,
SDA_PIN,
GPIO _secondal_module_function);
/*初始化USI_B0和I2C主控器以与从属设备进行通信*/
I2C_initMaster(EUSI_B3_base,&i2cConfig);
/*禁用I2C模块以进行更改*/I2C_DisableModule(EUSCI_B3_base)
;
/*启用I2C模块以开始操作*/I2C_enableModule*(EI2C_SCL/ 6.5 6.4
但它会被卡住
While (I2C_isBusBusy (EUSCI_B3_BASE));
因为UCBBUSY是Alwasy设置。
我发现UCBBUSY是在我执行I2C_enableModule(EUSSCI_B3_base)后立即设置的;
从不重置,但我尚未开始发送字节。
否则我会坚持
I2C_masterSendMultiByteFinish (EUSI_B3_BASE,
a_u8RegData);
您知道原因吗?