[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 초기화 코드
{
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();
}