工具/软件:
您好:
我目前正在使用 MSP430FR5969和 I2C 协议在 FT24C256A EEPROM 上写入数据。 我正在使用 MSP430FR5969 LaunchPad、并且将 P1.6和 P1.7用于我的 SCL 和 SDA。
我已将 a0、A1和 A2引脚连接到 GND、从而使地址为1010000 (0x50)。 当我尝试使用我代码中的写函数(代码如下)发送数据时 、我一直卡在第二个 while (!(UCB0IFG 和 UCTXIFG));该函数与我所做的研究意味着 EEPROM 不会发回 ACK。 如何解决此问题?
我还测量了 SCL 和 SDA 线、并观察到 SCL 上没有我预期的块信号。 同样、当我测量 SDA 线时、线路上的信号为高电平、当我发送一个起始位(使用 UCB0CTLW0 |= UCTR + UCTXSTT;)时、信号也会变为低电平。 我的问题是、我的代码是否有问题?
#include
#define EEPROM_ADDR 0x50
void i2c_init (void){
// zet pinfunctie voor I2C
P1SEL1 || BIT6 + BIT7;
P1SEL0且=~Ω(BIT6 + BIT7);
// zet eUSCI_B0 in 复位
UCB0CTLW0 = UCSWRST;
//配置器:I2C 主器件
UCB0CTLW0 |= UCMODE_3 + UCMST + UCSYNC + UCSSEL_SMCLK;
UCB0BRW = 160;// SCL = SMCLK/160 =~100kHz bij 16 MHz
UCB0I2CSA = EEPROM_ADDR;
UCB0CTLW0 &&~UCSWRST;// Haal uit 复位
}
void i2c_write_byte (unsigned int mem_addr、unsigned char 数据){
while (UCB0STATW 和 UCBBUSY);// wacht tot bus vrij is
UCB0CTLW0 |= UCTR + UCTXSTT;//主发送器、开始
while (!(UCB0IFG 和 UCTXIFG));
UCB0TXBUF =(mem_addr >> 8)& 0xFF;
while (!(UCB0IFG 和 UCTXIFG));
UCB0TXBUF = mem_addr 和0xFF;// LAG 字节
while (!(UCB0IFG 和 UCTXIFG));
UCB0TXBUF = DATA;// Gegevensbyte
while (!(UCB0IFG 和 UCTXIFG));
UCB0CTLW0 |= UCTXSTP;//停止
(UCB0CTLW0和 UCTXSTP);
}
unsigned char i2c_read_byte (unsigned int mem_addr){
unsigned char val;
(UCB0STATW 和 UCBBUSY);
UCB0CTLW0 |= UCTR + UCTXSTT;//传输开始
while (!(UCB0IFG 和 UCTXIFG0));
UCB0TXBUF = mem_addr >> 8;
while (UCB0IFG 和 UCTXIFG0);
UCB0TXBUF = mem_addr 和0xFF;
while (UCB0IFG 和 UCTXIFG0);
UCB0CTLW0 &=~UCTR;//开关导航接收
UCB0CTLW0 |= UCTXSTT;//重复启动
while (UCB0CTLW0和 UCTXSTT);// wacht tot start klaar
UCB0CTLW0 |= UCTXSTP;
VAL = UCB0RXBUF;
返回值;
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;// Stop DE WATCHDOG TIMER
PM5CTL0 &=~LOCKLPM5;// ZET GPIO 引脚活动(特定于 VOOR FRAM)
// zet P1.3、P1.4、P1.5 en P3.0 als 在 Trek ze Laag 中输出
P1DIR |= BIT3 | BIT4 | BIT5;//输出
P1OUT &=~(BIT3 | BIT4 | BIT5);// zet omlaag
P3DIR |= BIT0;
P3OUT &=~BIT0;
// zet p4.3 als 在 Trek die omhog
P4DIR |=位3;
P4OUT |= BIT3;
I2C_init ();// Initializeer I2C
//__delay_cycles (160000);// EEPROM 预热 tijd
//
//// Schrijf een byte naar de EEPROM op geheugenadres 0x00
// StartStopTest (0x00);
__delay_cycles (320000);// EEPROM 预热 tijd
// Schrijf een byte naar de EEPROM op geheugenadres 0x00
I2C_WRITE_BYTE (0x50、0x42);
__delay_cycles (320000 );/// wacht even voor de EEPROM om te schrijven
// Lees de byte terug van geheugenadres 0x00
unsigned char val = i2c_read_byte (0x0000);
// Stop de uitvoering、gebruik een breakpoint hier om "val" te bekijken
while (1);
}