본문 바로가기

Nordic/nRF52

[nRF52 xBee EVM] Arduino 테스트 - PCF8574 I2C

 

 

nRF52 xBee EVM 보드로 I2C IO확장 PCF8574보드를 테스트를 하려고 Arduino 코드를 실행 했는데 I2C가 동작 하지 않는다

nRF5 SDK 의 IAR 툴을 이용하여  I2C 테스트할 때는 문제가 없었는데...


Wirte 함수에서 멈춰 있다.

왜 그렇지?
 
 
옵션중에 -DNRF52 가 있는데...
 
-DNRF52를 DNRF52810으로 해 주어야 하는 것 아닐까?
 
플래그 설정을 -DNRF52810_XXAA 로 변경하니 에러가 많이 발생한다.
 
 
 
다시 DNRF52로 설정하면 컴파일은 잘 되지만 I2C가 정상 동작 하지 않는다.
 
 
NRF_TWIM1 를 0으로 바꾸면 어떨까?
 
I2C쪽 코드를 살펴보니 TowWire 설정이  NRF_TWIM1로 설정되어 있다.
NRF_TWIM0로 바꾸면 동작 하긴 하지만 TWIM0_TWIS0_TWI0_IRQ가 정의 되어 있지 않다고 에러가 발생 한다.
결국 TWIM0_TWIS0_TWI0_IRQn는 SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn로 둔채  NRF_TWIM1 만 0으로 바꾸터 테스트 해보면
출력이 되는것을 확인 할 수 있다.

 

 

최종적으로 설정한 값
TwoWire Wire(NRF_TWIM0, NRF_TWIS0, SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, PIN_WIRE_SDA, PIN_WIRE_SCL);
 

 

이제 nRF52 Aduino IDE 에서도 I2C가 잘 동작 한다.
#include <Wire.h>

#define LED_PIN1        18

#define PCF_8574_ADDR      0x20
void write8(uint8_t Address, uint8_t Value)
{
   Wire.beginTransmission(Address);
   Wire.write(Value);
   Wire.endTransmission();
}


void setup() 
{
  pinMode(LED_PIN1, OUTPUT);
  
  Serial.begin(115200);
  Serial.println("PCF8574 test");
  
  Wire.begin();
  Serial.println("write.. ");
  write8(PCF_8574_ADDR, 0xff);
  Serial.println("OK");
}


int cnt = 0;
void loop()
{
  if(cnt>8)cnt = 0;
  write8(PCF_8574_ADDR, ~(1<<cnt++));

  Serial.println(cnt);
  digitalWrite(LED_PIN1, 0);
  delay(100);

  digitalWrite(LED_PIN1, 1);
  delay(100);  
}
반응형