#include #include "system.h" #include "Open_I2C.h" //------------------------------------------------------------------------- unsigned int I2C_Read_Period() { unsigned char low,high; low = IORD(I2C_0_BASE,I2C_PRER_LO); high= IORD(I2C_0_BASE,I2C_PRER_HI); return (high<<16)+low; } //------------------------------------------------------------------------- unsigned char I2C_Read_Ctrl() { return IORD(I2C_0_BASE,I2C_CTR); } //------------------------------------------------------------------------- unsigned char I2C_Read_RX() { return IORD(I2C_0_BASE,I2C_RXR); } //------------------------------------------------------------------------- unsigned char I2C_Read_Status() { return IORD(I2C_0_BASE,I2C_SR); } //------------------------------------------------------------------------- void I2C_Write_Period(unsigned int Period) { IOWR(I2C_0_BASE,I2C_PRER_LO,Period&0xFF); IOWR(I2C_0_BASE,I2C_PRER_HI,Period>>16); } //------------------------------------------------------------------------- void I2C_Write_Ctrl(unsigned char value) { IOWR(I2C_0_BASE,I2C_CTR,value); } //------------------------------------------------------------------------- void I2C_Write_TX(unsigned char value) { IOWR(I2C_0_BASE,I2C_TXR,value); } //------------------------------------------------------------------------- void I2C_Write_CMD(unsigned char value) { IOWR(I2C_0_BASE,I2C_CR,value); } //------------------------------------------------------------------------- void I2C_Init(unsigned int Period) { I2C_Ctrl_Reg a; I2C_Write_Period(Period); a.I2C_Ctrl_Flags.CORE_ENABLE=1; a.I2C_Ctrl_Flags.INT_ENABLE=1; a.I2C_Ctrl_Flags.RESERVED=0; I2C_Write_Ctrl(a.Value); } //------------------------------------------------------------------------- unsigned char I2C_Send(unsigned char value,unsigned char STA,unsigned char STO) { unsigned char ACK; I2C_CMD_Reg I2C_CMD; I2C_Status_Reg I2C_Status; I2C_Write_TX(value); I2C_CMD.Value=0; if(STA!=0) I2C_CMD.I2C_CMD_Flags.STA=1; if(STO!=0) I2C_CMD.I2C_CMD_Flags.STO=1; I2C_CMD.I2C_CMD_Flags.WR=1; I2C_Write_CMD(I2C_CMD.Value); do { I2C_Status.Value=I2C_Read_Status(); } while(I2C_Status.I2C_Status_Flags.TIP); if(!I2C_Status.I2C_Status_Flags.RXACK) ACK=1; else ACK=0; return ACK; } //-------------------------------------------------------------------------