[LM3S608] Simple I2C 테스트 - simple polling mode
간단히 [LM3S608]의 I2C 개념 잡기 위해 우선 polling모드로 I2C Slave의 데이터를 읽어오는 실험을 했다.
I2C 구조
I2C초기화 함수
void i2c_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//
// Enable processor interrupts.
//
IntMasterEnable();
//
// Configure the appropriate pins to be I2C instead of GPIO.
//
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
//
// Initialize the I2C master.
//
I2CMasterInitExpClk(I2C0_MASTER_BASE, SysCtlClockGet(), false);
//
// Enable the I2C interrupt.
//
//IntEnable(INT_I2C0);
//
// Enable the I2C master interrupt.
//
//I2CMasterIntEnable(I2C0_MASTER_BASE);
}
Start 및 Address 설정
7bit Address이므로 1bit 시프트해 주고 Data 레지스터에 값쓴후 I2CMasterControl() 함수 호출하면 Start+Address날아 간다.
unsigned char i2c_start(unsigned char address)
{
// Start
I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, 0xFF&(address>>1), true);
// Write Address
I2CMasterDataPut(I2C0_MASTER_BASE, 0xFF&(address>>1));
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND);
return 0;
}
I2C Data Read
데이터 읽을때는 Slave의 ACK확인하고 I2CMasterDataGet()함수로 데이터 읽어오면 끝..
하드웨어로 I2C처리되니 상당히 간단하게 작성할 수 있다.
unsigned char i2c_readAck(void)
{
unsigned char read_data = 0;
//데이터 들어올 때 까지 대기.. 추가
while(1)
{
if(!I2CMasterBusy(I2C0_MASTER_BASE))break;
//ToDo Timeout
}
/*
while(g_ulState != STATE_IDLE)
{
//ToDo Timeout
} */
read_data = I2CMasterDataGet(I2C0_MASTER_BASE);
#define i2c_stop()
//-----------------------------------------------------------------------------