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从地址不正确

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/575339/msp432p401r-incorrect-i2c-slave-address-being-sent

部件号:MSP432P401R

使用driverlib,我编写了一些与从属传感器通信的代码。 从属设备的地址是0xC0,通过写入命令字节并启动读取操作来读取指定的寄存器来交互。 下面是我写的内容:

#include "driverlib.h"

#define I2C_Pins GPIO端口P3,GPIO _PIN6 + GPIO _PIN7
#define USI_MODULE EUSCI_B2_BASE
#define slaver_address 0xC0


/* I2C主配置参数*/
const eUSI_I2C_MasterConfig i2cConfig =

EUSCI_B_I2C_CLOCKSOURCE_SMCLK,// SMCLK时钟源
300万,// SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE_100KBPS,//所需的I2C时钟为100kHz
0,//无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};

内部主(无效)

WDT_A_HoldTimer();

/*为I2C选择端口1 -将引脚6,7设置为输入主模块功能,
*(UCB0SIMO/UCB0SDA,UCB0SOMI/UCB.S.)。
*/
GPIO_setAsPeripheralModuleFunctionInputPin (I2C_PINS,GPIO主要模块功能);

/*在100kHz的频率下将I2C主设备初始化到SMCLK,没有自动停止*/
I2C_initMaster(USCI_MODULE,&i2cConfig);

/*指定从属地址*/
I2C_setSlaveAddress (USI_MODULE,SLAVE_ADDRESS);

/*将主中继器设置为传输模式*/
I2C_setMode (USI_MODULE,EUSCI_B_I2C_Transmit_MODE);

/*启用I2C模块以启动操作*/
I2C_enableModule (USI_MODULE);

while (I2C_isBusBusy (USI_MODULE)== EUSCI_B_I2C_BUS_BUS_BUSY);

I2C_masterSendSingleByte (USI_MODULE,0x08);

I2C_masterReceiveSingle (USI_MODULE);
}

结果是发送0x80,代码无限期挂起,等待应答,但该地址没有从属设备,因此永远不会出现。 如果有人能帮助我理解为什么传输错误的从属地址,我将不胜感激。

谢谢!

基督教

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I²C从属地址有7位,因此0xC0不能是有效地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道为什么这对我来说不是很明显... 谢谢你。 某种方式或其他方式的Vishay数据表总是让我感觉更好。

    我将通过0xC0假设实际上的含义是0x60,最后一个r/w位