此篇利用GPIO造出I2C訊號,並操作FM24CL16B EEPROM, 程式部分是以Microchip MCU例子,但觀念可以用在其他廠牌MCU,只要改變週遭IO配置就可以,GPIO,I2C等程式可以參考[dsPIC33FJ32MC204-MCU學習筆記]16x2 LCD液晶螢幕(GPIO)這篇文章,
1. FM24CL16B程式
.h部份
#define driveAddress 0xA0
#define EEPROM_Length 10
/*
Name: EEPROM Global Variable
Version: V1.0
Author: Michael Cheng
Created Date:
Updated Data: N/A
Description:
Updated Record:
*/
typedef struct{
uint8_t readData[EEPROM_Length];
} _EEPROM_Type;
/* 結構變數EEPROM */
extern _EEPROM_Type EEPROM;
/* I2C Byte Write */
void I2C_ByteWrite(uint8_t address, uint8_t WriteAddr, uint8_t *writeData, uint16_t length);
/* I2C Read Register */
void I2C_Read_Register(uint8_t address, uint8_t writeAddr, uint8_t *readData, uint16_t length);
.c部份
_EEPROM_Type EEPROM;
/*
Name: I2C Byte Write
Version: V1.0
Author: Michael Cheng
Created Date:
Updated Data: N/A
Description:
Updated Record:
*/
void I2C_ByteWrite(uint8_t address, uint8_t WriteAddr, uint8_t *writeData, uint16_t length){
uint8_t i=0;
I2C_Start();
I2C_SendByte(address);
I2C_WaitAck();
I2C_SendByte(WriteAddr);
I2C_WaitAck();
for(i=0; i<length; i++){
I2C_SendByte(*(writeData + i));
I2C_WaitAck();
}
I2C_Stop();
}
/*
Name: I2C Read Register
Version: V1.0
Author: Michael Cheng
Created Date:
Updated Data: N/A
Description:
Updated Record:
*/
void I2C_Read_Register(uint8_t address, uint8_t writeAddr, uint8_t *readData, uint16_t length){
uint8_t i=0;
I2C_Start();
I2C_SendByte(address);
I2C_WaitAck();
I2C_SendByte(writeAddr);
I2C_WaitAck();
I2C_Start();
I2C_SendByte(address + 0x01);
I2C_WaitAck();
for(i=0; i<(length-1); i++){
*(readData + i) = I2C_ReadByte();
I2C_Ack();
delay_us(2);
}
*(readData + length - 1) = I2C_ReadByte();
I2C_NAck();
delay_us(2);
I2C_Stop();
}
2. mian程式
I2C_ByteWrite(driveAddress, 0x00, (uint8_t*)"ABC", 3);
delay_ms(100);
I2C_Read_Register(driveAddress, 0x00, EEPROM.readData, 3);
實驗結果