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.

[参考译文] MSP430F5501:使用 DriverLib 的 I2C 通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602196/msp430f5501-i2c-communication-using-driverlib

器件型号:MSP430F5501
主题中讨论的其他器件:MSP430F5510MSP430WARE

您好!

我对 MSP430的使用比较陌生、而且也刚开始作为 C 语言编程人员。

我基于 MSP430F5510微控制器设计了定制板。 我已经成功启动了原型、并且能够初始化两个基于外部晶振的时钟(XT1为32、768 KHz、XT2为24.0000 MHz)。 当我启动这些振荡器时、代码在每种情况下返回"成功"。 我能够顺利操作 I/O 引脚。

以下是初始化时钟的代码:

void initclks (void){
//初始化时钟。
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、(GPIO_PIN4 + GPIO_PIN5));
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、(GPIO_PIN3 + GPIO_PIN2));
UCS_setExternalClockSource (32768、24000000);
blnStatus = UCS_TurnOnLFXT1WithTimeout (UCS_XT1_DRIVE_0、UCS_XCAP_3、10);
blnStatus = UCS_TurnOnXT2WithTimeout (UCS_XT1_DRIVE_3、10);
UCS_initClockSignal (UCS_MCLK、UCS_XT2CLK_select、UCS_Clock_divider);
UCS_initClockSignal (UCS_SMCLK、UCS_XT2CLK_select、UCS_Clock_divider);
UCS_initClockSignal (UCS_ACLK、UCS_XT1CLK_select、UCS_Clock_divider);

但是、我现在正在尝试与从器件地址为0x45的板载外设芯片建立 I2C 通信。 我阅读了一份名为"使用 I2C 主设备用法的示例"的文档。 这是一个非常有用的文档、展示了如何通过具有 DMA 和不具有 DMA 的 I2C 发送和接收数据。 我尝试在我的项目中实现此代码。 但是、这个代码似乎不适用于 MSP430F5x 系列。

然后、我尝试遵循 DriverLib 文档中的示例代码。

我有一个子例程尝试初始化 I2C 模块:

void initi2c (void){
//初始化 I2C 外设。
USCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = UCS_getSMCLK ();
param.datarate = USCI_B_I2C_SET_DATA_RATE_400KBPS;
USCI_B_I2C_initMaster (USCI_B0_BASE、&param);

然后、我尝试通过调用以下子例程向 I2C 外设发送一个字节:

 

void set_tw8833_data (uint16_t i2c_add、uint8_t i2c_data){
//设置 TW8833的基址。
USCI_B_I2C_setSlaveAddress (USCI_B0_BASE、0x45);
USCI_B_I2C_setMode (USCI_B0_BASE、USCI_B_I2C_Transmit 模式);
USCI_B_I2C_ENABLE (USCI_B0_BASE);
USCI_B_I2C_clearInterrupt (USCI_B0_BASE、USCI_B_I2C_STOP_INTERRUPT + USCI_B_I2C_Transmit _INTERRUPT);

while (1)

USCI_B_I2C_masterSendSingleByte (i2c_add、i2c_data);
while (USCI_B_I2C_BUS_BUS_BUSY);

当我监控 I2C 数据和时钟线路时。 。 。 不会发生任何情况。

有人可以推荐介绍如何使用 MSP430F5510与 I2C 外设建立通信的文档吗?

感谢你的帮助、

最大

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

    感谢您发布此问题。

    您还可以在 TI 的 Resource Explorer 上找到一些很好的 USCI_BI2C 示例。 (http://dev.ti.com/tirex/#/)
    有关您的问题、您可以通过打开以下内容来找到示例
    Software->MSP430Ware -> Libraries -> Driver Library -> MSP430F5xx_6xx -> Example Projects->EUSCI_B_I2C

    请告诉我这是否对您有所帮助。

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

    除了 Travis 的建议、请参阅 SLAA734以了解有关典型 MSP430 I2C 通信问题的建议。 逻辑分析仪或示波器屏幕截图尤其有用、问题可能包括从器件地址错误到上拉电阻器值错误。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您已为 XT1/XT2功能配置了 P5.2/P5.3/P5.4/P5.5、但尚未配置 μ I²C 引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您推荐代码示例。 我成功使用 USCI_B_i2c_ex2_masterTxMultiple 代码的修改版本将多个字节传输到我的从器件。 我已经通过使用逻辑分析仪检查 I2C 数据和 I2C 时钟线路来验证了正常运行。  现在、我确信我的 I2C 外设已正确初始化。 我现在尝试从 I2C 外设读取数据。 我已通读 USCI_B_i2c_masterRxSingle 代码。 然而、这个代码似乎只读取已经被写入 MSP430F5510上内部接收寄存器的一个字节的信息。 我看不到我可以在外设中设置寄存器地址的位置、我想从中进行读取。  例如、我的器件的从器件地址为0x45。 我知道如何使用 USCI_B_I2C_setSlaveAddress 方法设置从器件地址。 我现在希望接收存储在地址为0x37的寄存器中的数据。 我在代码中的哪个位置设置0x37地址?
    谢谢、

    最大

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢。 您建议的文档非常有用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我现在已经完成了、我可以将数据传输到 I2C 外设。 但是、我还没有弄清楚如何从外设读取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅此 I2C 协议教程的"从器件读取数据"部分: www.robot-electronics.co.uk/i2c-tutorial

    通常、您将发送一个开始序列、将从器件地址+ R/W 位发送为低电平(写入)、写入您想要读取的地址(在您的情况下为0x37)、发送重复起始、将从器件地址+ R/W 位发送为高电平(读取)、从所需寄存器(连续读取一个或多个)读取、 然后发送停止序列。 我很高兴听到您有一个逻辑分析仪、因为创建此序列将需要一些实践。 在单独的 E2E 线程上有多个可建模的示例。

    此致、
    Ryan