《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 如何通過MAX2990 I2C接口向標準EEPROM (24C04)連接
如何通過MAX2990 I2C接口向標準EEPROM (24C04)連接
摘要: 本文介紹了如何通過MAX2990電力線通信調制解調器的I2C接口與外部EEPROM24C04連接,并給出了相應的固件例程。I²C總線受控于MAX2990(主機),24C04EEPROM為從機器件。以下框圖給出了本文示例的硬件配置。
Abstract:
Key words :

  引言

  本文介紹了如何通過MAX2990電力線通信調制解調器的I2C接口與外部EEPROM 24C04連接,并給出了相應的固件例程。I²C總線受控于MAX2990 (主機),24C04 EEPROM為從機器件。以下框圖給出了本文示例的硬件配置。

  

硬件配置 www.elecfans.com

 

  固件說明

  I²C接口初始化

  一旦使能I²C模塊,SCL和SDA必須配置成漏極開路狀態,以確保I²C總線通信正常。由于I²C是GPIO端口的一個替代功能,固件必須確保SCL和SDA輸入在初始化期間禁止上拉(通過對端口控制器的輸出位寫零實現)。

示例中,時鐘頻率為250kHz。首先需要配置MAX2990的I²C接口:

PO1_bit.Bit2 = 0; 		// Disables the GPIO function of the
PO1_bit.Bit3 = 0; 		// I2C pins

I2CCN_bit.I2CEN = 0; 	// Makes sure that I2C is disabled
			// to allow the changing of the I2C settings

I2CCN_bit.I2CMST = 1; 		// Sets the I2C engine to master mode
I2CCN_bit.I2CEA = 0; 		// 7-bit address mode
I2CCK_bit.I2CCKL = 0x40; 	// 2µs CLK-low, to define I2C frequency
I2CCK_bit.I2CCKH = 0x40; 	// 2µs CLK-high, to define I2C frequency

I2CTO = 200; 		// I2C_TIMEOUT
I2CST = 0x400; 		// Resets I2C status register

I2CCN_bit.I2CEN = 1; 		// Enables the I2C engine

寫模式

寫入24C04 EEPROM時,必須通過I²C接口寫入以下字節:

  1. EEPROM的I²C總線地址(這里為0xA0)
  2. EEPROM存儲器的地址
  3. 數據字節(地址將自動遞增)

示例中試圖寫入以下字節,從0x00地址開始,向EEPROM寫入:0x12、0x34、0x56、0x78和0x90。

i2c_init_write(); 	// Sets the MAX2990 I2C Engine into write mode
i2c_write(0x50); 	// 24C04 write (adr = 0b1010 000 0) = 0xA0
		// The MAX2990 I2C engine shifts the I2C address by
			// 1 bit, because it will generate the R/W bit
			// automatically

i2c_write(0x00); 	// word address location
i2c_write(0x12); 	// data1
i2c_write(0x34); 	// data2
i2c_write(0x56); 	// data3
i2c_write(0x78); 	// data4
i2c_write(0x90); 	// data5
I2C_STOP; 		// Sends I2C stop-condition

讀模式

讀取我們寫入EEPROM的數據時,為24C04留出足夠的寫時間非常關鍵。通常在“停止條件”后留出幾個毫秒的時間,請參考數據資料,確認您的時間設置符合IC的要求。

i2c_init_write(); 	// Sets the MAX2990 I2C engine into write mode
i2c_write(0x50); 	// 24C04 write (adr = 0b1010 000 0) = 0xA0
		// The MAX2990 I2C engine shifts the I2C address by
			// 1 bit, because it will generate the R/W bit
			// automatically

i2c_write(0x00); 	// word address location

i2c_init_read(); 	// Sets the MAX2990 I2C engine into read mode

i2c_write(0x50); 	// 24C04 read (adr = 0b1010 000 1) = 0xA1
		// The MAX2990 I2C engine shifts the I2C address by
			// 1 bit, because it will generate the R/W bit
			// automatically

unsigned char data[5]; 	// Array to store the received data
i2c_read(data[0]); // Reads 1 byte from I2C and writes it to the array
i2c_read(data[1]); // Reads 1 byte from I2C and writes it to the array
i2c_read(data[2]); // Reads 1 byte from I2C and writes it to the array
i2c_read(data[3]); // Reads 1 byte from I2C and writes it to the array
i2c_read(data[4]); // Reads 1 byte from I2C and writes it to the array
I2C_STOP; 		// Sends I2C stop-condition

現在,我們可以驗證一下用于EEPROM讀、寫操作的功能。

i2c_init_write(void)
i2c_init_read(void)
i2c_write(UINT8 data)
i2c_read(UINT8 *data)

 

void i2c_init_write(void)
{
I2CCN_bit.I2CMODE = 0; // I2C transmit mode
I2CCN_bit.I2CACK = 1; // Creates I2C NACK so that slave can create ACK
I2C_START; 		// Generates I2C START condition
while( I2CCN_bit.I2CSTART == 1 ); 	// Waits until the START condition
				// was put to the I2C bus
I2CST_bit.I2CSRI = 0; 		// Resets the I2C interrupt flag
}

int i2c_init_read(void)
{
I2CCN_bit.I2CMODE = 1; 	// I2C read-mode
I2CCN_bit.I2CACK = 0; 	// Creates I2C ACK after receive
I2C_START; 		// Generates I2C START condition

while( I2CCN_bit.I2CSTART == 1 ); 	// Waits until the START condition
I2CST_bit.I2CSRI = 0; 		// Resets the I2C interrupt flag
}

void i2c_write(UINT8 data)
{
I2CBUF = data; 			// Puts the data on the I2C bus
while( I2CST_bit.I2CTXI == 0 ); 	// Waits for transfer complete
I2CST_bit.I2CTXI = 0; 		// Resets the I2C transmit complete
				// interrupt flag
}

void i2c_read(UINT8 *data)
{
I2CBUF = 0xff; 	// Puts "all ones" on the I2C bus so that slave can pull
		// the bus down to generate zeros

while( !I2CST_bit.I2CRXI ); 		// Waits for receive complete
I2CST_bit.I2CRXI=0; 		// Resets the I2C receive complete
					// interrupt flag

*data = I2CBUF; 			// Writes the data to the pointer
}
此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: www亚洲色图| www.香蕉视频.com | 日皮视频免费观看 | 亚洲手机看片 | 黄色性情视频 | 在线国产视频观看 | 夜夜骑天天操 | 看全色黄大色黄女片18 | 国产成人爱片免费观看视频 | qvod激情视频在线观看 | 国产在线观看成人 | 国产精品亚洲w码日韩中文 国产精品小黄鸭一区二区三区 | 精品五夜婷香蕉国产线看观看 | 国产乱人伦精品一区二区 | 全网毛片 | 夜夜精品视频一区二区 | 在线观看成年 | 香蕉视频最新版 | 日韩视频在线观看一区 | 欧美成人精品高清在线播放 | 日本波多野结衣字幕久久 | 在线观看精品视频网站www | 韩国三级日本三级在线观看 | 一道本视频在线 | 亚洲国产成人久久一区www妖精 | 久久综合九色综合97婷婷女人 | 天天爽天天碰狠狠添 | 久久99综合国产精品亚洲首页 | 亚洲成人网页 | 午夜国产视频 | 夜夜躁天天躁很很躁 | 国产成人高清精品免费观看 | 日韩 欧美 综合 在线 制服 | 国产成人一区二区三区在线播放 | 日本一区免费 | 亚洲国产婷婷综合在线精品 | 天天干天天舔 | 一个人看的高清www视频免费 | 99爱视频99爱在线观看免费 | 欧美成国产精品 | 日日摸夜夜添夜夜免费视 |