/* SH7080 グループ ハードウェアマニュアル 図18.18 マスタ送信モードのフローチャート例 参照 図18.19 マスタ受信モードのフローチャート例 参照 */ #include "7080s.h" #define DEVICE_CODE_EEPROM 0xa0 // EEPROM DEVICE CODE:b'1010 #define SLAVE_ADRS_EEPROM 0x00 // SLAVE ADRS: b' 000 #define IIC_DATA_W 0x00 // WRITE DATA: b' 0 #define IIC_DATA_R 0x01 // READ DATA: b' 1 void IIC_init(void) { STB.CR3.BIT._IIC2 = 0; PFC.PBCRL1.BIT.PB3MD = 0x4; PFC.PBCRL1.BIT.PB2MD = 0x4; IIC2.ICCR1.BYTE = 0xA5; IIC2.ICIER.BIT.ACKE = 1; } int IIC_Read_EEPROM(unsigned short Address) { unsigned char data; while( IIC2.ICCR2.BIT.BBSY!=0 ); IIC2.ICCR1.BIT.MST = 1; IIC2.ICCR1.BIT.TRS = 1; IIC2.ICCR2.BYTE = 0xbd; IIC2.ICDRT = DEVICE_CODE_EEPROM | SLAVE_ADRS_EEPROM | IIC_DATA_W; while ((IIC2.ICSR.BIT.TEND) == 0) ; if(IIC2.ICIER.BIT.ACKBR != 0) return (-1); IIC2.ICDRT = (unsigned char)((Address>>8) & 0xff); while ((IIC2.ICSR.BIT.TDRE) == 0) ; IIC2.ICDRT = (unsigned char)(Address & 0xff); while ((IIC2.ICSR.BIT.TDRE) == 0) ; IIC2.ICCR1.BIT.TRS = 1; IIC2.ICCR2.BYTE = 0xbd; IIC2.ICDRT = DEVICE_CODE_EEPROM | SLAVE_ADRS_EEPROM | IIC_DATA_R; while ((IIC2.ICSR.BIT.TEND) == 0) ; if(IIC2.ICIER.BIT.ACKBR != 0) return (-1); IIC2.ICSR.BIT.TEND = 0; IIC2.ICCR1.BIT.TRS = 0; IIC2.ICSR.BIT.TDRE = 0; IIC2.ICIER.BIT.ACKBT = 1; IIC2.ICCR1.BIT.RCVD = 1; data = IIC2.ICDRR; while( (IIC2.ICSR.BIT.RDRF)==0 ); IIC2.ICSR.BIT.STOP &= 0; IIC2.ICCR2.BYTE = 0x3d; while ((IIC2.ICSR.BIT.STOP)==0) ; data = IIC2.ICDRR; IIC2.ICCR1.BIT.RCVD = 0; IIC2.ICCR1.BIT.MST = 0; IIC2.ICCR1.BIT.TRS = 0; return data; } int IIC_Write_EEPROM(unsigned short Address, unsigned char data) { while( IIC2.ICCR2.BIT.BBSY!=0 ); IIC2.ICCR1.BIT.MST = 1; IIC2.ICCR1.BIT.TRS = 1; IIC2.ICCR2.BYTE = 0xbd; IIC2.ICDRT = DEVICE_CODE_EEPROM | SLAVE_ADRS_EEPROM | IIC_DATA_W; while ((IIC2.ICSR.BIT.TEND) == 0) ; if(IIC2.ICIER.BIT.ACKBR != 0) return (-1); IIC2.ICDRT = (unsigned char)((Address>>8) & 0xff); while ((IIC2.ICSR.BIT.TDRE) == 0) ; IIC2.ICDRT = (unsigned char)(Address & 0xff); while ((IIC2.ICSR.BIT.TDRE) == 0) ; IIC2.ICDRT = data; while ((IIC2.ICSR.BIT.TEND) == 0) ; IIC2.ICSR.BIT.TEND = 0; IIC2.ICSR.BIT.STOP = 0; IIC2.ICCR2.BYTE = 0x3d; while ((IIC2.ICSR.BIT.STOP)==0) ; IIC2.ICCR1.BIT.MST = 0; IIC2.ICCR1.BIT.TRS = 0; IIC2.ICSR.BIT.TDRE = 0; wait(5); return 0; }
セコメントをする