主题中讨论的其他器件: 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
}