본문 바로가기

[TI]/LM3S8xx

[LM3S608] Simple I2C 테스트 - simple polling mode

[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()
//-----------------------------------------------------------------------------

반응형