페이지

글목록

레이블이 ARM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ARM인 게시물을 표시합니다. 모든 게시물 표시

2016년 10월 31일 월요일

[CC1310/sub-1GHz] 보드에 직접 만들어서 테스트 해 봤습니다.

CC1310 을 사서 PCB에 꾸며서 , AT Command Application 을 넣고 테스트해 봤는데
아주 빠르고 좋았습니다. 

20ms 마다 18 바이트를 50번 보냈는데, 잘 전송되었고, 
10ms 마다 전송했는데, 멈추네요.(CC1310 문제인지, UART로 연결해 놓은 MCU 문제인지 아직 파악은 못했지만, 
일단 20ms 로 전송이 잘 되서, 그냥 원인은 알아보지 않고 프로젝트를 진행 할 예정입니다)

로라 모뎀을 일반용으로 쓸 때는, 2초에 1번씩 전송됐는데, CC1310은 거기에 비하면 엄청 빠른거죠.^^





2016년 10월 21일 금요일

새로나온 MCU 인가? (4-core,400MHz 인데 $2대 네요)

저는 핀수 많지 않고 성능 좋은 MCU 가 없나, 가끔 검색을 합니다.

오늘 보니 특이한 놈이 있네요? 근래에 나온건가? 그럴테죠.

저는 첨 듣는 회사네요. XMOS 

아뭏든 가장 싼 모델이 4-core,400MHz(400MIPS) 인데, 가격이 디지키에서 $2.73 @ 5K 이네요.
디지키에서 이 가격이면 $2 초반이면 살 수 있을 듯 합니다.



크기는 아직 최적화가 안된듯 합니다. 48-TQFP 로 나오네요.
CSP 나 QFN 으로 나오면 2x2 mm, 4x4 mm 정도로도 나오겠네요.

용도는 RTOS를 사용시 매우 빠르다고 하는데요. 각 프로세스마다 1 core 씩 맡으면 동시에 4가지씩 처리하니 빠르겠네요.

내부 블럭도는 다음과 같습니다.




종류는 꽤 다양한데, 이 CPU가 속한 모델대의 사양은 다음과 같습니다.

2016년 10월 13일 목요일

[cc1310] AT command 프로그램 용량 테스트

CC1310 은 핀 수와 Flash 메모리 용량에 따라서 여러가지 모델이 있다.

가능하면 작은 패키지와 가격이 싼 모델로 구현을 해 보려고 했는데,
결론을 미리 말씀 드리면 32K는 안되고 64K 모델부터 되네요.

가격이 $2.5 @ 1K (CC1310F32,32K) 에서 $2.9 @ 1K(CC1310F64, 64K)로 올라가서 
가격이 $0.4 올라가버렸네요. ㅜㅜ


먼저 CC1310 의 메모리가 개발키트에는 128KB로 되어 있으므로 32K,64K 로 바꿔 보겠습니다.






[결론]
AT Command 프로그램을 적용하려면, 32K 모델은 사용할 수가 없고 적당한 모델은 64K 모델인 것 같습니다.

2016년 6월 9일 목요일

[PSOC] PSOC5 조도센서 I2C I/F 테스트

조도센서 ISL29023 (Intersil 사)를 테스트 해 봤습니다.

이 센서는 간략히 말하면, I2C I/F 방식으로 ALS(조도) 와 IR(적외선)을 continuous/once 로 측정할 수 있습니다.

일단 테스트로 ALS 를 continuous 로 측정해서, PSOC5 의 USB_UART 로 출력하도록 했습니다.

PSOC5 의 연결은 다음과 같습니다. (I2C, USB)



command 레지스터는 전원 ON시, 모두 0 으로 되므로 읽어도 아무 값도 안나옵니다. 파워 다운 모드로 되어 있어서 그런 것 같네요.

그래서 command-I 레지스터에 조도센서를 continuous 하게 샘플링하도록 설정했습니다.


USB-to-UART 로 출력하도록 해 놓고, 터미널로 본 내용은 다음과 같습니다.
밝은 상태에서 손을 데면 어두워지면서 값이 낮은 값으로 변합니다.



소스코드 링크 : psoc5_code

2016년 6월 7일 화요일

[nordic BLE] PCA10028 개발키트 프로그램 다운로드 방법

1. Keil MDK 툴 최신 버전을 받아서 설치합니다.

2. nRF BLE 칩의 stack 과 프로그램을 다운로드 할 수 있는 툴인 nRFGO Studio 툴을 다운로드 받아서 설치합니다.
Complete 버전으로 설치합시다. 안그러면 PCA10028 개발툴의 연결 안 되는 경우가 있습니다.

3. nRF51 SDK 를 다운로드 합니다. 여기에 각종 예제 파일과 soft device(stack 개념) 및 soft device+예제파일이 컴파일된 HEX 파일등이 들어 있습니다.

4. PCA10028 개발키트와 PC를 USB 케이블로 연결합니다.

5. 프로그램을 다운로드 해서 동작 시키는 방법은 여러가지가 있습니다. 3가지 정도 말씀드려 보겠습니다.
(제가 해본 내용은 Soft device를 설치해야 하는 BLE 예제만 동작 시켜 봤습니다.)

5-1. 각 예제 중에서 1개를 선택해서, 내부 폴더를 열면
hex 폴더가 있고 그 안에 ~pca10028.hex 로 끝나는 softdevice 와 application 프로그램이 통합된 파일이 있습니다.
이 hex 파일을 드래그해서 PCA10028 개발키트에 드롭해 주면 프로그램이 들어가서 자동 리셋된 후에 실행 됩니다.
(최근의 segger 디버거의 기능인듯 한데, PC에 연결하면 USB 드라이브가 1개 생기는데 이 드라이브에 hex 파일을 copy 해서 paste 해주면 프로그램이 다운로드되는 기능이 생겼습니다.)

5-2. nRFGO Studio 툴로 프로그램하는 방법.
- nRFGO Studio를 실행하면 왼쪽 아래의 Device manager 에서 segger debugger 를 선택하면, nRF51422 이 표시되는지 확인합니다.



- 우측 위의 Program Softdevice를 선택합니다. 나머지 작업은 그림에 써져 있네요.


- Program Application 탭을 선택하고 Keil MDK 컴파일러에서 컴파일된 hex 파일을 선택합니다.
여기서 hex 파일은 5-1 의 hex 파일과 다릅니다. 5-1의 hex 파일은 softdevice 가 포함되어 있고, 5-2의 hex 파일은 softdevice 파일이 포함되어 있지 않습니다. 주의하시기 바랍니다.
나머지 과정은 그림 내에 포함되어 있네요.


이렇게 하면 자동으로 리셋 후, 프로그램이 동작합니다.


5-3. KEIL MDK 컴파일러에서 직접 application program만 다운로드하는 방법.
이 방법은 Softdevice 가 먼저 설치되어 있어야 합니다. 5-2 의 Program Softdevice 까지는 똑같이 nRFGo Studio로 진행해 주시기 바랍니다.
그리고 나서 NRF51 SDK 의 Keil 예제 BLE 프로젝트 파일을 열어서(아무 것도 건드리지 말고) 컴파일 해서 프로그램 버튼을 눌러 주면 Application 만 특정 영역에 Update 됩니다.

[Keil MDK ver5 프로젝트 파일 위치]

[다운로드 버튼 : 컴파일 한 후, 다운로드 버튼을 눌러 주세요]

2016년 6월 3일 금요일

[PSOC] PSOC4 SPI 핀 <-> GPIO 핀

SPI 기능으로 설정된 핀을 잠시 GPIO 기능의 핀으로 바꿨다가 다시 SPI로 되돌리는 테스트를 했습니다.

이런 경우는 보통 드문데, 핀이 모자라서 하게 되었습니다.

SPI TopDesign 탭의 내용은 다음과 같습니다.




SPI -> GPIO 동작 방법은 다음과 같습니다.
1. SPI component STOP.
2. SPI 핀 모드를 GPIO 출력인 경우 Strong Drive 로 설정
3. SPI핀 기능을 GPIO 핀으로 변경
4. GPIO 기능 처럼 핀을 프로그램에서 사용.
    SPIFLASH_Stop();
    SPIFLASH_miso_m_SetDriveMode(SPIFLASH_miso_m_DM_STRONG);
    
    SPIFLASH_SET_HSIOM_SEL(*(reg32 *)SPIFLASH_miso_m__0__HSIOM, SPIFLASH_miso_m__0__HSIOM_MASK,
                                   SPIFLASH_miso_m__0__HSIOM_SHIFT, SPIFLASH_HSIOM_GPIO_SEL);

        SPIFLASH_miso_m_Write(1); CyDelayUs(1);
        SPIFLASH_miso_m_Write(0); CyDelayUs(1);
        SPIFLASH_miso_m_Write(1); CyDelayUs(1);

GPIO -> SPI 동작 방법은 다음과 같습니다.
1. SPI핀 기능을 GPIO 핀으로 변경
2. SPI component START.
    SPIFLASH_SET_HSIOM_SEL(*(reg32 *)SPIFLASH_miso_m__0__HSIOM, SPIFLASH_miso_m__0__HSIOM_MASK,
                                   SPIFLASH_miso_m__0__HSIOM_SHIFT, SPIFLASH_HSIOM_SPI_SEL);
    SPIFLASH_Start();

2016년 5월 28일 토요일

[nordic BLE] PCA10028 BLE 개요

안녕하세요, 노르딕 개발키트인 PCA10028 공부를 시작합니다.

이 키트는 노르딕 BLE 칩인 nRF51422_xxAC 라는 ARM-Cortex-M0 로 되어 있습니다.
간단한 스펙을 말씀드리자면 다음과 같습니다.

  • Single chip, highly flexible, 2.4 GHz multi-protocol device
  • 32-bit ARM Cortex M0 CPU core
  • 256kB/128kB flash and 32kB/16KB RAM
  • Supports Bluetooth Smart protocol stacks
  • Thread safe and run-time protected
  • Event driven API
  • On air compatible with nRF24L series
  • 3 data rates (2Mbps/1Mbps/250kbps)
  • +4dBm output power
  • -93dBm sensitivity, Bluetooth Smart
  • PPI system for maximum power-efficient applications and code simplification
  • Flexible power management system with automatic power management of each peripheral
  • Configurable I/O mapping for analog and digital I/O


일반적으로 BLE IC는 FLASH 메모리나 OTP ROM의 용량이 많은데, 이 메모리의 대부분은 스택이라는 BLE 관련 처리 Library 함수들이 들어가더군요. 다이얼로그 BLE 칩도 대부분 메모리가 OTP ROM 에서 BLE stack이 차지합니다. 노르딕도 마찮가지로 100KB가량을 노르딕에서 제공하는 Soft Device 라고 부르는 BLE STACK이 차지합니다. 이 스택은 전용툴인 NRF Go STUDIO 로 프로그램해서 넣어주고, Application 프로그램은 다른 어드레스 영역에 프로그램해서 돌아갑니다.

Application 프로그램은 BLE 에서 32KByte 가 안되도 충분히 돌아가고도 남습니다. 왜냐하면 필요한 함수가 STACK에 라이브러리로 이미 들어있으니까, 필요한 함수를 호출해서 쓰면 되니까 메모리가 더 필요 없게 되는 원리입니다.

^^. KEIL 컴파일러는 ARM 칩은 32KBYTE를 무료로 상용 버전과 똑같이 동작하므로 BLE 칩 업체들이 KEIL 컴파일러를 많이 사용하는 것 같습니다.얼핏, 알기로는 IAR 컴파일러는 ARM CORTEX-M0 는 16KB 밖에 지원 안되도록 정책이 바뀐 것으로 들었는데, 만약 이것이 사실이라면 업체에서 "왠만하면 KEIL 컴파일러를 사용하라"는 말의 의유는 무료 컴파일 코드사이즈 때문인 것 같네요.

제가 다루려는 SW는 BLE Peripheral 중 BLE-to-UART 라는 보통 SPP(Serial Port Profile)로 부르는 부분만 다루려고 합니다.
KC 인증을 받은 제품으로 BLE를 외주 개발로 잠깐 하는 것이라, 현재 다니는 회사 일과 연결이 안되고 시간도 없어서 그런 것이니 양해 바랍니다.


그리고 PCA10028 키트는 다음과 같은 페어차일드에서 파는 PBLN51822 모듈을 동작시키기 전에 SW 동작 확인을 위해 쓰기위한 중간과정입니다.
다음 번에는 BLE 프로그램 하는 방법을  다뤄 보겠습니다.

2016년 1월 4일 월요일

[dialog] peripheral_examples (sys_tick + UART2 + GPIO_input + PWM)

BLE를 제외하고 Peripheral을 몇개 조합해서 프로그램을 테스트해 봤습니다.

16MHz 일반 CPU처럼 사용한 예죠.

제가 생각하기에는 BLE 칩인 DA14580을 BLE 통신으로만 사용하기엔 버리는 것이 많은데,
평소에 좀 다양하게 통신 외적인 것도 연습을 해 두는 것도 좋을 것 같았습니다.

필요할 때 찾아 프로그램을 하다 보면, 겨우 기능만 구현하고 코드도 엄청 지져분해 져서, 다시보면 머리속이 새하얘지도록 잊어버리는 경우가 많은 것 같습니다.


저는 아직까지, 프로젝트를 처음부터 새로 만드는 방법은 모르겠습니다. 그래서 systick 프로그램 원형에다 UART2,GPIO INPUT,PWM을 차례로 추가했습니다.

1. systick 예제는 원래 1초마다 GPIO를 인터럽트에 의해 Toggle 하는 프로그램인데, 50ms마다 인터럽트가 걸리고 50ms 인터럽트가 10번 걸릴때마다(500ms 마다) P1.1이 토클 되도록 프로그램했습니다.

2. UART2 로 GPIO INPUT으로 개발 키트의 스위치 2개의 입력을 받아서 입력 값을 터미날로 출력하도록 했습니다.

3. GPIO INPUT으로 받는 스위치 2개로 PWM을 변경하도록 했습니다.


여기서 하나, 좀 힘들었던 부분은 pwm.h 를 추가하는 방법을 몰라서 헤맸는데, 이것을 추가하는 방법은

1. Option for target 버튼을 누른 후,

2. C/C++ TAB 의 Include Path 버튼을 눌러 줍니다.

3. Folder Setup 메뉴의 New(Insert)를 눌러서 다음의 Path를 추가합니다.
..\..\..\..\..\..\sdk\platform\driver\pwm




이렇게 하니 PWM.h 파일이 왼쪽 main.c 밑에 나타나는군요. 그런 후에 컴파일하면 프로그램이 잘 돌아 갑니다.


예제 파일은 다음 링크에 압축해서 추가해 놓았습니다.

하드웨어 구성은 사진과 같습니다.



스위치를 누르면 PWM1,2가 대칭으로 누를 때마다 변경이 되어 출력됩니다.

PC의 터미날로 버튼을 누를때, 마다 키값과 현재 PWM 의 인덱스가 표시되도록 했습니다.

[dialog] 개발 키트에서 디지탈 기능 핀의 이동 테스트

다이얼로그 IC는 메뉴얼이 좀 부실한데,

핀의 기능을 몇가지를 제외하면 다양한 위치로 이동이 가능합니다.
ADC 는 P0.0~3 에서만 사용 가능, BLE_DIAG 기능은 P0.0~7 에서만 사용가능.
여기서 혹시 BLE_DIAG 가 뭔지 아시는 분 계신가요? 메뉴얼을 찾아 봤는데 모르겠군요.( 이놈에 메뉴얼~)

지난 번에 너무 과하게 이동시키는 바람에 부팅핀을 이동해서 보드를 다시 떴지만, ㅠㅠ


UART 핀을 여러 곳으로 이동을 해서 테스트를 해 봤습니다.

RXD 기능은 일단 제외했습니다. 터미날에서 입력을 사용하면 프로그램 복잡하여, TXD로 UART 잘 되는지만 봤습니다.

먼저 P0 에서의 핀을 바꿨습니다. 
P0.4 가 TxD 였던 것을 RXD로 바꾸고, P0.5 가 RXD 연던 것을 TXD로 바꿔서 TTL-to-232 장치를 거쳐 232-to-USB를 통해 PC의 터미널로 받아봤습니다.
여기서 사용한 프로젝트는 다음의 위치에 있습니다.
DA1458x_SDK_5.0.3\DA1458x_SDK\5.0.3\projects\target_apps\peripheral_examples\uart\Keil_5\uart.uvprojx

제가 사용하는 IC는 QFN40 이라 포트가 P0, P1, P2 이렇게밖에 없는데, 각 포트별로 2핀씩만 이동을 해 보겠습니다.


이 프로젝트의 user_periph_setup.h 파일의 다음 부분을 고쳤습니다.
#define UART2_GPIO_PORT    GPIO_PORT_0
#define UART2_TX_PIN       GPIO_PIN_7
#define UART2_RX_PIN       GPIO_PIN_4

개발 보드하고 포트 이동 위치 사진입니다.



[ 터미날 출력 ]

출력이 다 똑 같은데, 그냥 중복해서 올립니다. 누가 믿거나 말거나 각 포트마다 각각 출력 결과입니다. ^^


이번엔 P1.0 TXD 출력 테스트 입니다.
user_periph_setup.h 파일의 다음 부분을 고쳤습니다.
#define UART2_GPIO_PORT    GPIO_PORT_1
#define UART2_TX_PIN       GPIO_PIN_0
#define UART2_RX_PIN       GPIO_PIN_1

개발 보드하고 포트 이동 위치 사진입니다.

[ 터미날 출력 ]



이번엔 P2.0 TXD 출력 테스트 입니다.
user_periph_setup.h 파일의 다음 부분을 고쳤습니다.
#define UART2_GPIO_PORT    GPIO_PORT_2
#define UART2_TX_PIN       GPIO_PIN_0
#define UART2_RX_PIN       GPIO_PIN_1


개발 보드하고 포트 이동 위치 사진입니다.

[ 터미날 출력 ]

2015년 12월 28일 월요일

[PSOC] PSOC4 I2C I/F with AT24C04(EEPROM) - Read (3/3)

EEPROM posting 마지막인, AT24C04 READ 동작 테스트입니다.

AT24xx IC의 READ 동작 방식은 3가지가 있습니다.
1. RANDOM BYTE READ
2. SEQUENTIAL READ
3. CURRENT ADDRESS READ

이 중, 테스트 결과 미리 말씀드릴 내용이 있는데,
3. Current Address Read 의 경우 Byte Write 와 Random Byte Read 를 실행한 다음에는 Current Address 값이 읽히는 것이 아니라 Current Address 위치의 데이터 값이 읽힙니다.
제가 잘 못한 것이 있는지 모르겠으나 여러번 테스트 해 봐도, 그렇네요.
Page Write 나 Sequential Read를 수행한 후에는 Address가 제대로 읽히네요.
또 1가지, Page의 마지막 1 바이트를 Random Byte Read로 읽은 후에는 Current Address Read가 제대로 동작합니다.

정리해보면 Current Address Read 명령은 다음과 같은 경우 동작한다.
1. Page Write 이후
2. Sequential Read 이후
3. Page의 마지막 데이터를 Random Byte Read한 이후

추가로 테스트해 본 결과, 전원 리셋 이후 AT24C04를 처음에 Current Address Read를 수행하면 0xFF 가 읽히고 그 다음에 계속 읽어 보아도 0xFF만 계속 읽히는 군요. 데이터가 읽히는 건지 current Address 가 계속 0xFF 고 자동으로 증가한다던 Address 가 증가를 안하는 건지 확인이 안되네요.


[1. RANDOM BYTE READ]
RANDOM BYTE READ 함수는 다음과 같이 정의했습니다.
uint8_t EEP_24C04_Read_Byte(uint32_t slaveAddress,uint8_t wordAddress)
{
    uint8_t rtn_val;
    
    I2C_1_I2CMasterWriteBuf(slaveAddress, &wordAddress, 1, I2C_1_I2C_MODE_COMPLETE_XFER );
    for(;;)
{
if(0u != (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_WR_CMPLT))
{
break;
}
}
    I2C_1_I2CMasterReadBuf(slaveAddress, &rtn_val, 1, I2C_1_I2C_MODE_COMPLETE_XFER);
for(;;)
{
        if(0u != (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_RD_CMPLT))
    {
    break;
    }
}    
    
    return rtn_val;
}


데이터시트를 보면 Device Address 와 Word Address 를 Dummy Write 하라고 했는데, 이 동작에서 Dummy 라는 말이 문제가 있습니다. Dummy 는 쓰레기 또는 아무 의미 없는 동작을 말하는데 테스트 결과, Dummy로 넣은 Word Address 에 의해 Word Address 에 해당하는 데이터가 출력됩니다. 이것은 Dummy 라는 표현이 옳지 않은 것 같습니다.


어쨓든 Device Address(/Write) + Word Address 를 Write한 후에  I2C_1_I2CMasterReadBuf() 함수로 데이터를 1개 읽으면 됩니다.

동작 테스트 예로써, 다음과 같은 코드를 실행해 봤습니다.
    i=0;
    i2c_buffer[i++] = EEP_24C04_Read_Byte(0x52,0x14);

Device Address : 0x52 , Word Address : 0x14 에 해당하는 데이터를 1개 읽는 동작입니다.

오실로스코프로 측정한 결과는 다음과 같습니다.

0x04가 읽혔네요. 이건 맞습니다. 이전에 제가 Word Address 0x10~0x1F 에 데이터 0x00~0x0F를 Write 했으니, Word Address 0x14 에 해당하는 데이터는 0x04 가 맞는 거죠.

UART로 뿌려 보니 0x04가 나오는 군요.
 

[2. SEQUENTIAL READ]

SEQUENTIAL READ 동작은 RANDOM BYTE READ 에서 1 BYTE만 읽던 것에 추가로 여러바이트를 읽으면 됩니다.
Device Address(/Write) + Word Address 를 Write한 후에  I2C_1_I2CMasterReadBuf() 함수로 데이터를 여러개 읽으면 됩니다.

동작시퀀스는 다음과 같습니다.


제가 만든 함수 원형은 다음과 같습니다.

void EEP_24C04_Read_Sequential(uint32_t slaveAddress,uint8_t wordAddress,uint8_t *RdData,uint32_t cnt)
{
    I2C_1_I2CMasterWriteBuf(slaveAddress, &wordAddress, 1, I2C_1_I2C_MODE_COMPLETE_XFER );
    for(;;)
{
if(0u != (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_WR_CMPLT))
{
break;
}
}
    I2C_1_I2CMasterReadBuf(slaveAddress, (uint8 *) RdData, cnt, I2C_1_I2C_MODE_COMPLETE_XFER);
for(;;)
{
        if(0u != (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_RD_CMPLT))
    {
    break;
    }
}    
}

테스트 동작 코드의 예는 다음과 같습니다.
EEP_24C04_Read_Sequential(0x52,0x10,i2c_buffer,16);

Device Address : 0x52 , Word Address : 0x10부터 16개의 데이터를 순차적으로 읽는 동작입니다.

오실로 스코프로 측정한 결과는 다음과 같습니다.

안보여서 확대해 본 그림은 다음과 같습니다.

앞부분만 분석해 본 결과 제대로 송/수신이 되고 있네요. 
0x52(Device Address)+/Write+ACK , 
0x10(Word Address)+ACK, 
0x52(Device Address)+Read+ACK , 
0x00+ACK , 0x01+ACK , 0x02+ACK~..

UART로 출력한 결과 다음과 같습니다.

제대로 읽혀졌음이 확인됐습니다.


[3. Current Address Read]
현재 어드레스를 읽는 동작으로 Random Byte Read에서 Write Code(Device address+Wordaddress) 를 뺀 것 과 같습니다.

함수 정의는 다음과 같습니다.
uint8_t EEP_24C04_Read_Address(uint32_t slaveAddress)
{
    uint8_t rtn_val;
    
    I2C_1_I2CMasterReadBuf(slaveAddress, &rtn_val, 1, I2C_1_I2C_MODE_COMPLETE_XFER);
for(;;)
{
        if(0u != (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_RD_CMPLT))
    {
    break;
    }
}    
    
    return rtn_val;
}

맨 처음 문제를 제기한 것 처럼, Page Write 나 Sequential Read 일 때만 제대로 동작합니다. 다른 의미로는 페이지의 마지막 데이터를 Access한 다음에만 동작한다고도 할 수 있겠네요.

동작 시퀀스는 다음과 같습니다.


오실로 스코프로 측정한 결과 입니다. 

Word Address 0x21이 읽히네요.

다음은 UART로 출력한 결과 입니다. UART에는 0x20 이 읽히는데, 위의 스코프 데이터와 관련없이 보십시요. 위의 파형은 Current Address Read만 1번 더 실행해서 측정하다 보니 Address 가 자동으로 +1 되어 0x21이 되어 버렸습니다.



자, 이것으로 I2C 기초 공부를 마치겠습니다. 혹시 Current Address Read 의 애매한 부분을 아시면 댓글 남겨 주시기 바랍니다. ^^

그리고 PSOC Creator 예제 파일추가 링크 입니다.