이제 I2C 통신 테스트를 해 보려고 합니다.
먼저 Cube 툴에서 I2C1 을 선택했더니, PB6(I2C1_SDA) , PB7(I2C_SCL) 로 핀아웃이 배정되는군요.
Nucleo 보드의 핀위치는 다음과 같습니다.
현재 제가 갖고 있는 I2C 테스트하기 가장 좋은 놈이 하나 있군요. 예전에 PSOC4로 I2C를 테스트하려고 산 EEPROM 모듈(AT24C04)가 있어서 Nucleo 보드와 위의 핀에 연결해 봤습니다.
I2C 테스트 코드를 IRQ 용으로 작성을 했는데, 아직은 IRQ 처럼 사용하지는 않았습니다.
그저 Write 테스트를 해 보려했습니다.
I2C Write 방식은
'시작 + 7비트 DEVICE ADDRESS + R/W + ACK(EEPROM 에서 응답) + 끝' 이 기본이고,
여기서 추가로 데이터를 몇개 더 보낼 때는,
'시작 + 7비트 DEVICE ADDRESS + R/W + ACK(EEPROM 에서 응답) + 8비트 데이터#1 + ACK(EEPROM 에서 응답)
+ 8비트 데이터#2 + ACK(EEPROM 에서 응답) + ....+ 8비트 데이터#n + ACK(EEPROM 에서 응답) + 끝' 과 같이 하면 됩니다.
I2C 디바이스는 각각 고유의 DEVICE ADDRESS가 있는데, 위의 AT24C04 모듈의 DEV ADDR 은 0x50 입니다.
따라서 main.c 에 어드레스를 다음과 같이 정의했습니다.
#define I2C_ADDRESS 0x50
그리고 main() 함수에 다음을 추가해서 오실로 스코프로 찍어볼 준비를 했구요.
(I2C 설정은 Cube 툴에서 해주니 설정에 관한 설명은 생략합니다)
i2c_tx_buf[0] = 0x01;
i2c_tx_buf[1] = 0x02;
i2c_tx_buf[2] = 0x03;
if(HAL_I2C_Master_Transmit_IT(&hi2c1, (uint16_t)I2C_ADDRESS, i2c_tx_buf, 3)!= HAL_OK)
{
/* Error_Handler() function is called in case of error. */
Error_Handler();
}
그런데 스코프로 찍어 보니, 7비트 어드레스만 우측으로 1비트 밀려서 나가고 더이상 데이터가 나오지 않아서
자세히 보니, 어드레스를 좌측으로 1비트 밀어야 ACK가 응답으로 오면서 후속 데이터가 제대로 나가겠구나 .. 라는 생각이 드네요.
그래서 DEVICE Address 를 다음과 같이 수정했고,
#define I2C_ADDRESS (0x50 << 1)
오실로 스코프의 파형도 정상으로 나왔습니다.
소스 파일 첨부합니다.
'STM32F4' 카테고리의 다른 글
[STM32F4xx] Nucleo 보드 테스트 #7 (u-SD - SDIO-4Bit :KEIL) (0) | 2016.12.01 |
---|---|
[STM32F4xx] Nucleo 보드 테스트 #6(I2C 2/2 인터럽트:KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #4(UART2 Interrupt:KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #3 (Cube 사용법&Timer3 Interrupt:KEIL) (0) | 2016.12.01 |
[STM32F4xx] Nucleo 보드 테스트 #2(GPIO 출력:KEIL) (0) | 2016.12.01 |