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.

[参考译文] MSP430FR5969:发送地址后 I2C 卡在 while 环路中

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1009141/msp430fr5969-i2c-stuck-in-a-while-loop-after-address-sent

器件型号:MSP430FR5969

您好!  

FR5969中的同一问题、没有解决方案发送正确的从器件地址。  

我正在尝试向 OLED 显示屏126x64 0.96"发送数据、但无法从该显示屏获得回复。

我想知道、这是否会是从 MCU 发送地址的问题、因为显示屏在另一个 MCU 上工作。

不过、在示波器上、我可以看到地址已发送、但8位数据不会跟随。

我卡在同一环路中: while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG);

 我是否可以执行任何操作来从器件旁路确认位?  

下面是我的完整代码:

#include "driverlib.h"  
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define Slave_Address 0x78

void main (void)

WDT_A_HOLD (WDT_A_base);

PM5CTL0 &=~LOCKLPM5;

CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider);  
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider);  

GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN6 + GPIO_PIN7、
GPIO_secondary 模块功能);

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 = 1;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);


EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、Slave_Address);// indirizzo dello 从器件

EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_TRANSMITH_MODE);//定义 ISCO UC 成为 TRASMISSIONE 的主器件

EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);// ABIILITO LA I2C


GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);//LED2

uint8_t I2C_msg = 0xAA;

GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);// ALZO IL 引脚支持 LED

while (1)

EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、I2C_msg);


}  

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

    driverlib (轮询) I2C 函数通常不会检查 NACK、因此如果您有 NACK、您会看到此症状。

    我的 I2C OLED (我想来自 Adafruit)位于地址0x3C、而不是0x78。

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

    Bruce、您好、感谢您的回答。  

    在系列用户指南中、我可以看到 I2C 主 MCU 在地址发送后等待 NACK、然后发送数据。 我的 I2C OLED 是一个未知品牌、我无法获得足够的文档、我只有一些库和 I2C 地址。 但是、它在其他品牌的 MCU 上工作。

    在示波器上、我看到发送了正确的地址、但后面没有数据、SCL 变为低电平、而函数残桩出现在 while 环路中。
    我猜、 如果我 也可以从 MCU 发送数据、而无需 NACK。 是否有办法绕过它?  

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

    您是否尝试使用地址0x3C? 我有几个"神秘品牌"I2C OLED (相同系列、不同尺寸)、它们也在地址0x3C 进行响应。

    我的假设是、有人为您提供了 SLA 字节、而不是 I2C 地址、因为(0x3C << 1)= 0x78。