반응형
Serial EEPROM CAT24C32를 I2C interface로 STM32F103를 이용하여 제어.
Compiler는 System Workbench와 CMSIS library를 사용.
Byte Write를 우선 구현. Sequence는 아래와 같다.
I2C 설정 부터 한다.
아래의 순서로 구현.
1. IO 설정.
2. I2C 초기화.
3. Serial EEPROM Byte write sequence 구현.
아래의 코드 참고
1. IO 설정.
1234567891011 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // PORTB// Alternate Output Push PullGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Pin = PIN_I2C_SCL | PIN_I2C_SDA;GPIO_Init(GPIOB, &GPIO_InitStructure); cs
2. I2C 초기화.
1234567891011121314151617 void hal_i2c_init() { I2C_DeInit(I2C2); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); I2C_InitTypeDef i2c_initStruct; I2C_StructInit(&i2c_initStruct); i2c_initStruct.I2C_Mode = I2C_Mode_I2C; i2c_initStruct.I2C_DutyCycle = I2C_DUTYCYCLE; i2c_initStruct.I2C_ClockSpeed = I2C_SPEED; I2C_Init(I2C2, &i2c_initStruct); I2C_Cmd(I2C2, ENABLE);} cs
3. Serial EEPROM Byte write sequence 구현.
Device address는 0xA0로 하였다. A2, A2, A0에 모두 0 연결
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 int hal_i2c_writeByte(uint8_t slaveAddr, uint16_t regAddr, uint8_t byte) { I2C_AcknowledgeConfig(I2C2, ENABLE); I2C_GenerateSTART(I2C2, ENABLE); int timeout = I2C_TIMEOUT; while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)) { if((timeout--) == 0) { // Error return -1; } delay_us(1); } I2C_Send7bitAddress(I2C2, slaveAddr, I2C_Direction_Transmitter); timeout = I2C_TIMEOUT; while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((timeout--) == 0) { // Error return -2; } delay_us(1); } // Register Address 15-8 I2C_SendData(I2C2, (uint8_t)((regAddr >> 8) & 0x00FF)); timeout = I2C_TIMEOUT; while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((timeout--) == 0) { // Error return -3; } delay_us(1); } // Register Address 7-0 I2C_SendData(I2C2, (uint8_t)(regAddr & 0x00FF)); timeout = I2C_TIMEOUT; while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((timeout--) == 0) { // Error return -4; } delay_us(1); } I2C_SendData(I2C2, byte); timeout = I2C_TIMEOUT; while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((timeout--) == 0) { // Error return -5; } delay_us(1); } I2C_GenerateSTOP(I2C2, ENABLE); timeout = I2C_TIMEOUT; while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)) { if((timeout--) == 0) { // Error return -6; } delay_us(1); } delay_us(100); return 0;} cs
728x90
반응형
'공부 > HW' 카테고리의 다른 글
210316 Serial EEPROM CAT24C32 (Byte read) (0) | 2021.03.23 |
---|---|
210318 C data types (C99 Standard) (0) | 2021.03.18 |
210316 Serial EEPROM CAT24C32 (0) | 2021.03.16 |
210310 스탭모터 S curve 가속 코드 구현 (0) | 2021.03.12 |
210219 X-NUCLEO-IHM01A1 Stepper Motor driver (0) | 2021.03.09 |