您好!
我正在尝试使用以下代码与 EEPROM (M24C02-FMN6TP)通信。 如果我执行此代码并使用示波器观察 SDA 和 SCL、我只会看到一个"序列":
开始条件- EEPROM 地址(0x50)-#WRITE_FLAG -来自 EEPROM 的 ACK - 1字节(0x66)-来自 EEPROM 的 ACK -停止条件
现在、问题不是为什么我只能看到一个序列、也不是我想知道为什么它只包含一个单字节。 问题是为什么序列中的那个字节是数据字节(0x66)而不是地址(0x05)?
感谢您的回复。
Christian
#include <msp430.h> #include <stdint.h> void init_16_MHz_clock(void) { //Unlock CS registers with CSKEY password. CSCTL0 = CSKEY; //Set DCOCLK = 16 MHz. CSCTL1 &= ~(DCOFSEL1 + DCOFSEL0); CSCTL1 |= DCORSEL + DCOFSEL_2; //Set ACLK = SMCLK = MCLK = DCOCLK. CSCTL2 = SELA_3 + SELS_3 + SELM_3; //Set all dividers to 0. CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; //Lock CS registers again. CSCTL0_H = 0; } void hold_watchdog_timer(void) { WDTCTL = WDTPW + WDTHOLD; } void init_i2c(const uint8_t eeprom_address) { P1SEL0 &= ~(0xC0u); P1SEL1 |= 0xC0u; UCB0CTLW0 |= UCSWRST; UCB0CTLW0 &= ~(UCA10 + UCSLA10 + UCMM + UCTXACK + UCTXNACK + UCTXSTP + UCTXSTT); UCB0CTLW0 |= UCMST + UCMODE_3 + UCSYNC + UCSSEL__SMCLK + UCTR; UCB0CTLW1 &= ~(UCETXINT + UCCLTO1 + UCCLTO0 + UCSTPNACK + UCSWACK + UCASTP1 + UCASTP0 + UCGLIT1 + UCGLIT0); UCB0CTLW1 |= UCASTP_2; UCB0BRW = 160; UCB0TBCNT = 1; UCB0I2COA0 &= ~(UCGCEN + UCOAEN); UCB0I2COA1 &= ~(UCOAEN); UCB0I2COA2 &= ~(UCOAEN); UCB0I2COA3 &= ~(UCOAEN); UCB0ADDMASK |= 0x3FFu; UCB0CTLW0 &= ~UCSWRST; UCB0I2CSA = eeprom_address; //Test if the bus is free, otherwise a manual clock on is generated. if(UCB0STATW & UCBBUSY) { P1SEL1 &= ~0x80; P1OUT &= ~0x80; P1DIR |= 0x80; P1SEL1 |= 0x80; } UCB0IE = 0; UCB0IFG = 0; UCB0IV |= 0xFFFFu; } void eeprom_write(const uint8_t address, const uint8_t data) { unsigned short i; const uint8_t buffer[2] = {data, address}; UCB0CTLW0 |= UCTR; UCB0IE |= UCTXIE0; while(UCB0STATW & UCBBUSY); UCB0CTLW0 |= UCTXSTT; for(i = 2; i > 0; --i) { UCB0TXBUF = buffer[i - 1]; while(!(UCB0IFG & UCTXIFG0)); } UCB0IE &= ~UCTXIE0; UCB0IFG = 0; UCB0IV |= 0xFFFFu; while(UCB0STATW & UCTXSTP); } uint8_t eeprom_read(const uint16_t address) { return 0; } int main(void) { unsigned short i; const uint8_t EEPROM_ADDRESS = 0x50u; const uint8_t write_values[6] = {0x11u, 0x22u, 0x33u, 0x44u, 0x55u, 0x66u}; volatile uint8_t read_values[6] = {0}; hold_watchdog_timer(); init_16_MHz_clock(); init_i2c(EEPROM_ADDRESS); //Write values to addresses 0x05..0x00 in the EEPROM. for(i = 6; i > 0; --i) { eeprom_write(0x00u + i - 1, write_values[i - 1]); } //Read values from addresses 0x05..0x00 in the EEPROM. for(i = 6; i > 0; --i) read_values[i - 1] = eeprom_read(0x00u + i - 1); return 0; }