[ST_MICRO]/STM32F32016. 12. 20. 00:26

[STM32F373 EVM] I2C 테스트 - 9축 IMU 센서 테스트

[STM32F373 EVM] I2C 테스트 - 9축 IMU 센서 테스트




[STM32F373 EVM]에는 I2C가 PB8(SCL), PB9(SDA)에 할당되어 있다. I2C테스트를 위해 9축 IMU센서(BNO055 EVM)의 롤,피치 값을 TFT LCD에 표시하는 예제를 작성해 보았다.


PB8 -> SPI2_SCK/I2S2_CK,I2C1_SCL, USART3_TX,CAN_RX, CEC, TIM16_CH1,TIM4_CH3, TIM19_CH3,COMP1_OUT, TSC_SYNC

PB9 -> SPI2_NSS/I2S2_WS,I2C1_SDA, USART3_RX,CAN_TX, IR_OUT,TIM17_CH1, TIM4_CH4,TIM19_CH4, COMP2_OUT



STM32F373 EVM 회로도 핀맵



STM32F373의 I2C 블록도






STM32F373 I2C 초기화 함수

#define I2Cx                             I2C1

#define I2Cx_CLK_ENABLE()                __I2C1_CLK_ENABLE()

#define I2Cx_SDA_GPIO_CLK_ENABLE()       __GPIOB_CLK_ENABLE()

#define I2Cx_SCL_GPIO_CLK_ENABLE()       __GPIOB_CLK_ENABLE() 


#define I2Cx_FORCE_RESET()               __I2C1_FORCE_RESET()

#define I2Cx_RELEASE_RESET()             __I2C1_RELEASE_RESET()


//Definition for I2Cx Pins

#define I2Cx_SCL_PIN                    GPIO_PIN_8

#define I2Cx_SCL_GPIO_PORT              GPIOB

#define I2Cx_SCL_AF                     GPIO_AF4_I2C1

#define I2Cx_SDA_PIN                    GPIO_PIN_9

#define I2Cx_SDA_GPIO_PORT              GPIOB

#define I2Cx_SDA_AF                     GPIO_AF4_I2C1



void BNO055_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStruct;

  

  /*##-1- Enable peripherals and GPIO Clocks #################################*/

  /* Enable GPIO TX/RX clock */

  I2Cx_SCL_GPIO_CLK_ENABLE();

  I2Cx_SDA_GPIO_CLK_ENABLE();

  /* Enable I2C1 clock */

  I2Cx_CLK_ENABLE(); 

  

  /*##-2- Configure peripheral GPIO ##########################################*/  

  /* I2C TX GPIO pin configuration  */

  GPIO_InitStruct.Pin       = I2Cx_SCL_PIN;

  GPIO_InitStruct.Mode      = GPIO_MODE_AF_OD;

  GPIO_InitStruct.Pull      = GPIO_PULLUP;

  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;

  GPIO_InitStruct.Alternate = I2Cx_SCL_AF;

  

  HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct);

    

  /* I2C RX GPIO pin configuration  */

  GPIO_InitStruct.Pin = I2Cx_SDA_PIN;

  GPIO_InitStruct.Alternate = I2Cx_SDA_AF;

    

  HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);

  

  

  I2cHandle.Instance             = I2Cx;

  

  I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;

  I2cHandle.Init.Timing      = 400000;

  I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;

  //I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_2;

  I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_ENABLED;

  I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLED;

  I2cHandle.Init.OwnAddress1     = 0xFE;

  I2cHandle.Init.OwnAddress2     = 0xFE;    

  

  

  HAL_I2C_Init(&I2cHandle);  

}




STM32F373 I2C 송수신 함수

unsigned char read8(unsigned char addr, unsigned char data)

{

    unsigned char tx_buf[2];

    unsigned char rx_buf[4];

    tx_buf[0] = data;

   

    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)addr, (uint8_t*)tx_buf, 1, 10000)!= HAL_OK)

    {


    }

    

    while(HAL_I2C_Master_Receive(&I2cHandle, (uint16_t)addr, (uint8_t *)rx_buf, 1, 10000) != HAL_OK)

    {

    }

  

    result = rx_buf[0];

}


void write8(unsigned char addr, unsigned char reg, unsigned char data)

{

    unsigned char tx_buf[2];


    tx_buf[0] = reg;

    tx_buf[1] = data;


    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)addr, (uint8_t*)tx_buf, 2, 10000)!= HAL_OK)

    {

    }

}




STM32F373 I2C 테스트 동영상

I2C인터페이스로 BNO055 센서의 롤,피치 값을 TFT LCD에 표시하는 테스트 


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC2016. 8. 17. 03:24

dsPIC33 EVM - I2C 테스트

dsPIC33 EVM - I2C 테스트




dspic33_i2c.pdf


dsPIC33 EVM  보드의 I2C는 RG2(SCL), RG3(SDA)에 연결되어 있다.





dsPIC33 I2C 초기화 코드

void i2c_init(unsigned int Speed)

{

OpenI2C1( I2C_ON, I2C_BRG );

}




dsPIC33 I2C Read/Write 소스 코드

unsigned char i2c_read_byte(unsigned char Addr, unsigned char reg)
{
unsigned char data = 0;
unsigned char SlaveAddress = Addr;
char i2cData[10];
int DataSz;
int Index = 0;
i2cData[0] = (SlaveAddress << 1) | 0;
i2cData[1] = reg;
DataSz = 2;
StartI2C1();
IdleI2C1();
while( DataSz )
{
MasterWriteI2C1( i2cData[Index++] );
IdleI2C1();
DataSz--;
if( I2C1STATbits.ACKSTAT )
break;
}
RestartI2C1();
i2c_wait(10);
IdleI2C1();
MasterWriteI2C1( (SlaveAddress << 1) | 1 );
IdleI2C1();
data = MasterReadI2C1();
StopI2C1();
IdleI2C1();
return data;
}
void i2c_write_byte(unsigned char Addr, unsigned char reg, unsigned char data)
{
unsigned char SlaveAddress = Addr;
char i2cData[10];
int DataSz;
int Index = 0;
char status;
i2cData[0] = (SlaveAddress << 1) | 0;
i2cData[1] = reg;
i2cData[2] = data;
DataSz = 3;
StartI2C1();
IdleI2C1();
while( DataSz )
{
MasterWriteI2C1( i2cData[Index++] );
IdleI2C1();
DataSz--;
if( I2C1STATbits.ACKSTAT )
break;
}
StopI2C1();
IdleI2C1();
}






















dsPIC33 EVM을 이용한 I2C 온습도 센서 테스트 예제



Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42012. 9. 10. 00:23

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

 

 

3축 가속도 센서를 테스트 해야할 일이 있어 STM32F407 보드를 이용하여 I2C 테스트를 해보았다. 기존 STM32F103 I2C 테스트 코드과 크게 차이 없이 테스트 가능했다.

 

[EXP-NET EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.

 

 

 

 

SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 13번에 각각 CS핀이 할당되어 있다.

 

 

 

STM32F4 I2C테스트 동영상

STM32F407 을 이요하여 3가속도 센서의 데이터를 TFT-LCD에 그래프로 표시하는 테스트 예제




STM32F4 I2C 초기화 코드

void i2c_init1(unsigned int Speed)
{
 I2C_InitTypeDef  I2C_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     
    //Configure I2C2 pins: SCL and SDA
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;    
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //Connect pins to I2C peripheral
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);  
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

    //I2C2 and I2C2 Periph clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);    
 
    //I2C2 configuration
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_OwnAddress1 = 0x33;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = Speed;
    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, &I2C_InitStructure);
}

 

 

STM32F4 가속도 센서 I2C 제어 코드 

//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 0

#define MY_ACCEL3LV02_I2C_MODE 1


//#define ACCEL_CS_BIT BIT6

//#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_BIT BIT11

#define ACCEL_CS_PORT PORTE


#define ACCEL_CS_INIT() RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);\

GPIO_InitStructure.GPIO_Pin=ACCEL_CS_BIT;\

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;\

GPIO_Init(GPIOC, &GPIO_InitStructure);\

ACCEL_CS_DEASSERT()

#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)


#define ACCEL_SPI_INIT() SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte



#define myAccelI2C_INIT                 i2c2_init

#define myAccelI2C_START                i2c2_start

#define myAccelI2C_WRITE                i2c2_write

#define myAccelI2C_READ_NAK             i2c2_readNak

#define myAccelI2C_STOP                 i2c2_stop



//-----------------------------------------------------------------------------
//myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
unsigned char myAccel3lvRead(unsigned char reg)

 unsigned char data = 0; 
 
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);

    // 레지스터 설정
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_READ);       // device address 및 read mode 설정
   
 data = myAccelI2C_READ_NAK(); 
 myAccelI2C_STOP(); 


 return data;
}

 

//myAccel3LV02의 특정 레지스터에 데이터를 기록
void myAccel3lvWrite(unsigned char reg, unsigned char data)
{
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);         // 레지스터 설정
 myAccelI2C_WRITE(data);        // 데이터 출력
 myAccelI2C_STOP();  
}

 

Posted by nexp

댓글을 달아 주세요

[TI]/LM3S8xx2009. 3. 30. 21:03

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

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F20132009. 3. 18. 21:34

MSP430 I2C 전송 속도 테스트

MSP430 I2C 전송 속도 테스트




MSP430F2013 보드는 UART가 없어 I2C로 데이터를 수집테스트 정리

구성도
MSP430F2013 (I2C Slave) ->AVR (I2C Master) -> USB2Serial -> PC Host



AVR - > 8Mhz 구동
MSP430F2013 -> 16Mhz구동

2Byte 데이터 수집 속도 측정


H/W 구동시

100Khz
구동시 450us 소요된다.

150Khz 까지 구동 가능하고 이때는 300us 소요된다. (200Khz 이상부터 깨지기 시작한다.)

->메인클럭을 16Mhz까지 올리니 400khz도 문제 없이 잘 동작한다.
 

S/W I2C 구현시
AVR 8Mhz클럭에서  600us 소요된다.

 


H/W I2C
구현 예제

unsigned char ReadByte8( unsigned char add)

{

           unsigned char data_in = 0;

          

           i2c_start_wait(add);

           data_in = i2c_readAck(); 

           i2c_stop();

 

           return (data_in);

}

 

S/W I2C 구현 예제

unsigned char ReadByte8( unsigned char add)

{

           unsigned char data_in = 0;

          

           I2C_Start();

           #if _USE_I2C_DELAY

           Delay_us(I2C_DELAY);

           #endif

 

           I2C_PutByte(add);

           #if _USE_I2C_DELAY

           Delay_us(I2C_DELAY+10);

           #endif  

           I2C_Nack();

 

           #if _USE_I2C_DELAY       

           Delay_us(I2C_DELAY);

           #endif

 

           data_in = I2C_GetByte();

           #if _USE_I2C_DELAY

           Delay_us(I2C_DELAY);

           #endif

           I2C_Nack();

 

           //Delay_us(100);

           I2C_Stop();

 

           return (data_in);

}

Posted by nexp

댓글을 달아 주세요