[ST_MICRO]/STM32G2018. 12. 14. 05:11

#STM32G030 EVM - I2C 테스트 (TMP275 온도 센서의 온도 측정)

#STM32G030 EVM - I2C 테스트 (TMP275 온도 센서의 온도 측정)


STM32G-SSM EVM 보드는 표준 핀맵을 통일화 해서 다양한 확장보드에 공용으로 테스트 할 수 있도록 제작한 보드 이다. I2C도 핀 맵핑에 따라 동일한 위치에서 테스트 가능하다.



SSM EVM표준 핀맵




SSM EVM 확장 테스트 보드 연결

SSM EVM 표준 핀맵을 테스트 할수 있는 다양한 확장 테스트 보드를 이용해서 I2C 테스트를 진행 해 볼수 있다. 

우선 I2C로 온도 값을 읽을 수 있는 TMP275 온도 센서 모듈을이용하여 SSM EVM 확장 테스트 보드에 연결하여 I2C를 테스트 해 보자.





STM32CubeIDE를 이용하여 기본 핀맵 설정하고 I2C 셋팅을 한 후 코드 생성하면 자동으로 I2C 설정 코드가 생성된다.


SSM EVM 핀맵에 맞도록 STM32G031에서 I2C1을 PA12(SDA), PA11(SCL)에 할당 했다.






생성된 코드를 이용하여 TMP275에서 온도 값을 읽어 오는 코드를 추가 해주면 I2C로 TMP275의 온도 값을 읽어 올 수 있다.


#define _TMP275_ADDRESS                 (0x48<<1)
#define _TMP275_REG_CONFIG              1
#define _I2C_DELAY_TIME                 1000
#define I2C_HANLDLE                     hi2c2

unsigned int read16(unsigned char addr, unsigned char data)
{
    unsigned char buf[2];

    HAL_I2C_Master_Transmit(&I2C_HANLDLE, addr, &data, 1, _I2C_DELAY_TIME);
    HAL_I2C_Master_Receive(&I2C_HANLDLE, addr|0x01, buf, 2, _I2C_DELAY_TIME);
    return (buf[0]<<8|buf[1]);

}




  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
         x = (read16(_TMP275_ADDRESS, 0)>>4)%0xFFF;

         printf("%.2f\r\n", (float)x/16.0);
         HAL_Delay(500);
    /* USER CODE BEGIN 3 */

  }





STM32G 시리즈에서 TMP275 온도 센서 모듈을 이용하여 간단히 I2C 테스트를 진행해 보았다. STM32CubeIDE를 이용하니 코어가 바뀌어도 별다른 설정없이 I2C를 테스트 할 수 있어 편리한것 같다.




Posted by nexp

댓글을 달아 주세요

[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

댓글을 달아 주세요