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.

[参考译文] MSP430F2232:I2C 至 24AA128 EEPROM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1529147/msp430f2232-i2c-to-24aa128-eeprom

器件型号:MSP430F2232
主题中讨论的其他器件: MSP430FR5969

工具/软件:

您好:

我尝试使用 I2C 将数据从 MSP430F2232 发送到 24AA128 EEPROM。 我已经通过 MSP430FR5969 完成了它、但想使用 MSP430F2232 完成它。

我已经发现、在对 I2C 代码进行编程时、两个微控制器之间存在差异。  

但现在我陷入了某种困境。 运行代码时、我被困在写函数的第二个“ while(!(IFG2 & UCB0TXIFG));“循环中。  

似乎 24AA128 没有发回确认、但我不确定。 有人能告诉我我我的 MSP430F2232 代码是否有问题吗?

代码为:

#include

#define EEPROM_ADDR 0x50 // 7 位 I2C 地址 (A2:A0 = GND)

void i2c_init (void);
void i2c_write_eeprom_byte(unsigned int mem_addr、unsigned char 数据);
unsigned char i2c_read_eeprom_byte (unsigned int mem_addr);
void DELAY_ms(无符号整型 ms);

void main (void)

WDTCTL = WDTPW | WDTHOLD;
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHz;
DCOCTL = CALDCO_1MHz;

i2c_init ();

// Schrijf een byte naar EEPROM
I2C_WRITE_EEPROM_BYTE (0x00、0xAB);
DELAY_ms (10);// Schrijfvertraging

// Lees Hem terug
unsigned char waarde = i2c_READ_EEPROM_BYTE (0x00);

// zet de waarde ergens 在调试的 LED, afhankelijk van jouw toeping
// bijv。 ALS (WAARDE == 0xAB) 大于 LED aan

while (1);
}

void i2c_init (void)

P3SEL |= BIT1 + BIT2;// P3.1 = SDA、P3.2 = SCL
UCB0CTL1 |= UCSWRST;// USCI 处于复位状态
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、SYNC 模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;// SMCLK、USCI 未处于复位状态
UCB0BR0 = 10;// 100kHz bij 1MHz SMCLK
UCB0BR1 = 0;
UCB0I2CSA = 0x50;//从器件地址
UCB0CTL1 且=~UCSWRST;// USCI 复位
IFG2 &=~(UCB0TXIFG + UCB0RXIFG);//清除标志
}

void i2c_write_eeprom_byte(unsigned int mem_addr、unsigned char 数据)

while (UCB0STAT 和 UCBBUSY);// wacht tot bus vrij 是
UCB0CTL1 |= UCTR + UCTXSTT;// TX 模式+ START

while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF =(mem_addr >> 8)& 0xFF;// Hoog 字节地址

while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = mem_addr 和 0xFF;// LAag 字节地址

while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = DATA;// Gegevensbyte

while(!(IFG2 & UCB0TXIFG));
UCB0CTL1 |= UCTXSTP;//停止条件
(UCB0CTL1 和 UCTXSTP);
}

unsigned char i2c_read_eeprom_byte (unsigned int mem_addr)

unsigned char 数据;
While (UCB0CTL1 & UCTXSTP);// wacht op vorige stop

// STAP 1:Geef adres door(写入)
UCB0CTL1 |= UCTR + UCTXSTT;// TX 模式+ START
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF =(mem_addr >> 8)& 0xFF;// Hoog 字节

while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF = mem_addr 和 0xFF;// LAG 字节

while(!(IFG2 & UCB0TXIFG));
// STAP 2: Herstart + Lees
UCB0CTL1 &=~Ω UCTR;// RX 模式
UCB0CTL1 |= UCTXSTT;// HERSTART

while (UCB0CTL1 和 UCTXSTT);// wacht tot adres verzonden 是
UCB0CTL1 |= UCTXSTP;//停止卷积字节

while(!(IFG2 & UCB0RXIFG));// wacht op RX
DATA = UCB0RXBUF;

返回数据;
}


void DELAY_ms(无符号整型 ms)

while (ms--)_delay_cycles (1000);// 1ms bij 1MHz
}

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

    设置 TXIFG 的第一个实例发生在早期。 在器件地址已发送和确认之前重复该操作。 似乎器件从未确认该地址。

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

    是的、但代码运行到第一个 TXIFG、而不是在下一个代码的 TXIFG 停止:

    while(!(IFG2 & UCB0TXIFG));
    UCB0TXBUF = mem_addr 和 0xFF;// LAag 字节地址

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

    这正是器件未确认地址时卡住的地方。

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

    那么、如何解决该问题呢?

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

    了解 EEPROM 无响应的原因。

    地址错误? 未连接?

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

    因此、我尝试了检查问题可能是什么。 我已将地址位连接到 GND、这意味着地址应为 0x50 (1010000)、我也在代码中使用该地址。 我已经测量了引脚、SDA 和 SCL 线似乎已连接、VCC 为 3.6V。 所有其他引脚均连接至 GND

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

    尊敬的 Sytze:
    您可能应该尝试另一个器件来尝试与 EEPROM 进行通信。 如果这样可以正常工作、那么 MSP430 就是问题所在。 如果这样做不起作用、我建议与支持该 EEPROM 的团队交谈。

    此致、

    Diego Abad

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

    您好:

    我尝试使用示波铲测量 SCL 和 SDA 线。 当我测量 SCL 线时、一切都正常工作。

    但当我不测量 SCL 线时、它不起作用。 我认为这与内阻的示波勺.  

    有人能告诉我为什么会出现这种情况吗?

    但现在它确实有效、感谢您的帮助。