edk

i2c read / write by gpio

xilinx 2011. 11. 24. 23:31





unsigned int iic_24lc04_lowest (int sda0, int sda1, int scl0, int scl1)
{
unsigned int *add;
unsigned int data;

add = (unsigned int *) XPAR_AXI_GPIO_I2C_SFP_BASEADDR;
*add = 0xfffffffc;

*(add + 4) = ((sda0)<<1) | scl0;
usleep(10);

*(add + 4) = ((sda1)<<1) | scl1;
usleep(10);

data = *(add) >> 1;
return data;
}


ML403 보드의 REF DESIGN을 수정 했습니다. 위의 코드는 GPIO 하위 2비트를 각각 (SDA, SCL)로 정하고 해당하는 비트를 조작해서 I2C 프로토콜을 만듭니다.


다음 코드는 매크로를 정의한 내용 입니다.

/* Macros to send data to IIC via bit bang */
#define SEND0 iic_24lc04_lowest(0,0,0,1)
#define SEND1 iic_24lc04_lowest(1,1,0,1)
#define START iic_24lc04_lowest(1,0,1,1)
#define STOP iic_24lc04_lowest(1,0,0,0);iic_24lc04_lowest(0,1,1,1);iic_24lc04_lowest(1,1,0,1);iic_24lc04_lowest(1,1,0,1)
#define ACK iic_24lc04_lowest(1,1,0,1)
#define IDLE iic_24lc04_lowest(1,1,1,1)
#define NOACK ACK