256320.jpg

此篇利用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);   

實驗結果

1.JPG

arrow
arrow
    文章標籤
    MCU GPIO UART EEPROM
    全站熱搜

    鄭智遠 發表在 痞客邦 留言(0) 人氣()