페이지

글목록

2016년 6월 28일 화요일

[PROC] Cypress BLE KIT인 CY8CKIT-042 BLE 테스트

다음번에는 Cypress BLE 키트인 CY8CKIT-042 BLE 로 SPP(Serial Port Profile) 테스트 내용을 올려보겠습니다.

SPP 는 예전에 블루투스 클래식에서 쓰던 프로파일이라고 하는데,
이름이야 상관없는데 회사마다 BLE-to-UART 프로파일을 부르는 말이 조금씩 차이가 있네요.

아뭏든, BLE<-->UART 기능은 다이얼로그의 DSPS나 노르딕이나 같습니다.

Cypress 의 BLE-to-UART 프로파일은 Cypress가 등록한 것이 없어서 Custom Profile로 누가 만들어 놨는지 모르지만,
인터넷에서 찾아서 테스트를 해 봤습니다.

동작은 잘 됩니다만, BLE-to-UART 앱이 없어서 BLE 모듈과 USB 동글을 사용하여 PC와 연결해서 테스트를 했습니다.

오늘은 다음에 다룰 내용만 잠깐 이야기 해 봤습니다.

이만 마치겠습니다.

[PSOC] PSOC5 'DAC+내부 OPAMP' 로 25mA POWER 만들기

안녕하세요,

이번에는 PSOC5 로 POWER 출력을 만드는 방법을 소개 합니다.
최근에는 BLE 나 센서들이 저전력 구조로 설계되어 있으니 수십 mA 또는 10mA 이내의 전류면 충분히 동작 가능합니다.

PSOC5 키트인 CY8CKIT-059 에서 이 테스트를 진행했습니다.
059 키트는 5V 전원을 사용하고 , 여기에 I2C 방식인 조도 센서 ISL29023 을 3.3V 전원으로 DAC+OPAMP 출력을 연결했습니다.

따라서, 전원은 5V 하나만 있고 센서용 전원으로 따로 3.3V 레귤레이터를 필요로 하지 않습니다.

메뉴얼을 보니, PSOC5 의 OPAMP의 Fllower 모드의 High Power 옵션에서 전류는 최대 25mA 까지 출력 될 수 있다고 나와 있습니다.


DAC+AMP POWER 회로 연결은 다음과 같습니다.



테스트용 PSOC 059 KIT의 전체 회로도는 다음과 같습니다.

PSOC Creator의 Resource Meter를 통해 확인해 보니 PSOC5의 DAC 출력은 4개, OPAMP 출력도 4개가 있네요.

예전에 조도센서를 I2C로 테스트한 내용은 동일하고, 여기에 DAC+AMP 로 파워를 만들어 넣었습니다.
DAC 만으로 가능하지 않을까 해서 먼저 테스트 해 보니, 전류가 모자라서 안돼서
AMP를 연결하니 제대로 동작하는 것을 확인해 봤습니다.

다음에 시간이 나면 BLE도 이런 방식으로 전원을 연결해 보겠습니다.

자세한 내용은 소스를 첨부하니 참고해 주시기 바랍니다. (링크)

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 내부 LCLK(32KHz)로 변경 방법

개발키트인 PCA10028 은 32KHz Crystal 이 회로에 내장되어 있지만,
프로차일드에서 판매하는 BLE 모듈인 PBLN51822 모듈에는 32KHz 크리스탈이 내장되어 있지 않습니다.

그래서 같은 프로그램을 PBLN51822 모듈에 다운로드했을 때,
아무 동작도 하지 않아서 노르딕 FA 에 문의를 해서 알게된 내용입니다.

다음의 main.c 파일에 있는 ble_stack_init()함수의 내용을 그 아래와 같이 변경해 주시면 됩니다.

static void ble_stack_init(void)
{
    uint32_t err_code;
   
    nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
   
    // Initialize the SoftDevice handler module.
    SOFTDEVICE_HANDLER_APPSH_INIT(&clock_lf_cfg, true);
   :
   :
}

아래와 같이 변경..

static void ble_stack_init(void)
{
    uint32_t err_code;
    
    //nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
    
    nrf_clock_lf_cfg_t clock_lf_cfg;
    
    clock_lf_cfg.source = NRF_CLOCK_LF_SRC_RC;
    clock_lf_cfg.rc_ctiv = 1;
    
    // Initialize the SoftDevice handler module.
    SOFTDEVICE_HANDLER_APPSH_INIT(&clock_lf_cfg, true);

   :
   :
}


[nordic BLE] PCA10028 BLE-to-UART(SPP)예제 20-Byte 구분 char 변경

nordic BLE 를 사용하면서 좀 이상한 점은,
APP 에서 20-Byte 이상은 한번에 전송되지 않는다는 점과 
20-Byte 마다 또는 전송이 끝날 때 마다 구분용 char('\n') UART RxD로 출력된다는 점입니다.

다이얼로그에서는 이런 현상이 없었는데, 좀 다른 점이 있네요.
제가 얼핏 보기로는 BLE 는 모두 20-Byte 단위로 전송이 이루어 지고 연속으로 보내지는 것 처럼 보이는 것은 APP에서
20 Byte 전송 데이터 사이마다 딜레이를 줘서 연속으로 전송되는 것 처럼 보이는 것이라 들었습니다.

확실히 모르는데, 앱 개발자가 한 말이고 제가 앱을 모르니까 그런가 보다 하고 있습니다. ^^

nRF51 디바이스에서 20-Bte 마다 또는 전송이 끝날 때마다 구분자를 출력하는 부분은 다음과 같이 정의되어 있습니다.
main.c 파일의 nus_data_handler 함수에서 처리합니다.


전송이 완료되면 '\n' 이 출력되도록 디폴트 설정이 되어 있는데,
일반적으로 아무것도 출력하지 않고 사용하더군요.

뭐, 취향에 맞게 다른 값으로 고치셔도 되고.. 
만약 아예 안나오도록 하려면 다음과 같이 주석처리를 하시면 됩니다.

static void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length)
{
    for (uint32_t i = 0; i < length; i++)
    {
        while(app_uart_put(p_data[i]) != NRF_SUCCESS);
    }
    //while(app_uart_put('\n') != NRF_SUCCESS);
}

[nordic BLE] PCA10028 BLE-to-UART(SPP)예제 페어링 Time 변경

현재 SPP 프로젝트의 동작을 보면,
2초 간격으로 180초 동안 페어링을 하고 있습니다.

그리고 180초 이후에는 Sleep 모드로 빠져서 BLE 장치를 리셋하거나, 
WAKEUP 시키는 버튼을 눌러서 재시작하도록 되어 있습니다.

혹시, 중간에 sleep 모드로 빠져서 문제가 있는 경우 
1. Timeout 값을 조정하거나,
2. 필요할 때 마다 리셋 핀을 통해서 리셋을 하거나,
3. 입력핀에 wakeup 신호를 줘서 restart 하거나,
4. 아예 Timeout 시간을 없애서 계속 살아 있어서 페어링을 계속 진행하는 방법이 있습니다.

이 중에서 1,4번 은 같은 파라메터값을 조정해서 변경 가능합니다.
main.c 파일에서 APP_ADV_TIMEOUT_IN_SECONDS 값을 바꾸면 페어링 시간을 1초 단위로 조정할 수 있습니다.
그리고 값을 0으로 하면 sleep mode로 빠지지 않고 무한하게 페어링을 할 수 있습니다.

번 리셋 핀은 h/w 에서 리셋 핀을 ON/OFF 하거나 BLE 모듈의 전원을 ON/OFF 하면 됩니다.

3번 현재 개발키트의 버튼 4개 중에 1개인데, 기억이 안나네요. 찾아보면 메뉴얼이 있으니 필요한 분은 찾아보시길 바랍니다.

[nordic BLE] PCA10028 BLE-to-UART(SPP)예제 device name 변경

maiin.c 파일의 DEVICE_NAME 을 변경해 주면 됩니다.
(가장 짧은 게시글이 될 것 같네요 ^^)

[nordic BLE] PCA10028 BLE-to-UART(SPP)예제 Baudrate 변경

nRF51 SDK 의 예제 중에서 다음의 위치에서 Keil MDK 프로젝트 파일을 더블 클릭하면,
KEIL 컴파일러가 자동으로 실행됩니다.

[예제 위치]
..nRF5_SDK_11.0.0_89a8197\examples\ble_peripheral\ble_app_uart\pca10028\s130\arm5_no_packs

main.c 의 uart_init() 함수의 파라메터를 수정하면 UART 관련 설정을 조정할 수 있습니다.
보레이트를 다른 값으로 조정하려고 하면, nrf51_bitfields.h 파일에 정의되어 있는 여러가지 보레이트를 
uart_init 함수에서 파라메터를 바꿔 줌으로써 변경 가능합니다.

현재 default 설정으로 hw flow control이 설정되어 있는데, 위의 예제에서 저는 다음과 같이 수정해서 hw flow control 기능을 제거했습니다.

        //APP_UART_FLOW_CONTROL_ENABLED,
APP_UART_FLOW_CONTROL_DISABLED,


여러가지 변경해서 테스트 해 보시기 바랍니다.

[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년 5월 27일 금요일

[PSOC] PSOC4 AUDIO IC(ISD21xxx) 동작 테스트

예전에 올려 보려고 한 AUDIO 출력 IC 입니다.

PSOC4로 제어해 봤는데, 다른 CPU로도 간단하게 제어 가능한 IC 입니다.

예전에 AUDIO IC에 대해 아무런 지식이 없어서, wave 파일을 raw 데이터로 SPI로 샘플링 주파수를 설정하고 
밀어 넣으면 동작할 것이라 생각하고 wave 파일 구조를 공부해서 정리했었는데 그렇게 제어하는 것이 아니였습니다. ㅜㅜ

괜한 3일을 날려 버렸던 놈인데, 아주 간단히 제어하는 놈이었습니다.

메뉴얼을 제가 이해를 잘 못 한 것도 있지만, 많이 부실하기도 했고요.

ISD2130 AUDIO IC는 SPI로 데이터를 실시간으로 전송하면서 제어할 수 없는 IC라고 합니다.(저는 메뉴얼에서 가능하다고 읽었고 sale 하는 분이 안된다고 해서 더 이상 진행은 않했습니다)

사용 방법은 다음과 같습니다.
1. 내부에 메모리가 있어서 먼저 SPI 통신으로 AUDIO 데이터를 내부 메모리에 USB 전송 툴로 Write 한다고 합니다.
2. USB 전송툴과 윈도우 프로그램에 의해 각각의 AUDIO 소스마다 VP(Voice Prompt 라고 하네요) INDEX를 부여해 줍니다.
3. ISD2130 IC에 SPI 통신으로 PU(Power Up) -> CFG0 REG(Sampling 주파수 설정) 설정 -> CFG_REG2(Compression Souce) 설정 -> VOLC(Volume Control) -> PLAY VP(Voice Prompt #) -> PD(Power Down) 의 과정으로 스피커로 음원이 출력됩니다.

여기서 한가지 주의할 점은 VOLC 명령은 동작하지 않는다는 점 입니다.
아무리 해도 안되서 연락해서 알아본 결과, WR_CFG_REG 명령을 통해서 우회적으로 VOLC 레지스터를 Write 해야 볼륨을 변경할 수 있습니다.

또, 한가지 주의할 점은 VOLC 레지스터의 값은 0x00 이 최대 볼륨이고 0xFF가 가장 작은 볼륨이랍니다.
이것도 전화 연락해서 알 수 있었습니다.

많이 헤메면서 시간이 좀 걸렸지만, ISD2130 은 꽤 쓸만했습니다. 가격이 600원대에 8KHz 로 샘플링하면 꽤 긴 음성 파일 포함해서 저장된 데이터 38개를 Play할 수 있었으니 부저보다 훨씬 다양한 용도로 저렴하게 사용 가능했습니다.


하드웨어는 SPI로 연결하면 됩니다. 인터럽트 입력은 별로 필요 없고 STATUS READ 명령으로 BUSY를 체크하면 됩니다.


PSOC TopDesign.cysch 탭에서 SPI 콤포넌트를 1개 불러다 놓고, /CS 핀을 1개 불러 놓습니다.
다른 CPU에서도 SPI 통신 레지스터 설정 잘 하시고 함수 불러다 쓰시면 됩니다.
현재 프로젝트에서 SPI 통신 1개에 4가지가 연결되어 있어서, 대표적인 Device 이름을 따서 SPI 콤포넌트 이름을 SPIFLASH 로 했습니다. AUD_RDY 핀은 만들어만 놓고 사용하지 않았습니다.



다음은 PSOC4 를 사용할 때, SPI 설정 내용입니다.



버퍼 사이즈는 적당히 조정을 해 주세요. 저는 너무 많이 잡은 듯 합니다.


메인 함수에서 Audio 출력 함수를 사용하는 예는 다음과 같습니다.

main()
{
    SPIFLASH_SCBCLK_Start();
    SPIFLASH_Start();
    CyGlobalIntEnable; /* Enable global interrupts. */

    audio_play(0x21,0x1A);   // 0x21 VP 를 VOLC 0x1A 로 Play
    while(1);
}

다음은 PSOC4 에서의 audio_play 함수 정의 내용입니다.
void audio_play(uint8_t aud_index,uint8_t aud_vol)
{
    uint8_t tx_test_bf[10];
    char tx_buf[100];

    tx_test_bf[0] = 0x10;   // Power up
    SPI_Aud_Write_String(tx_test_bf,1);
    
    tx_test_bf[0] = 0x00;   // CFG_REG0 –Sample Rate Override
    tx_test_bf[1] = 0x60;
    SPI_Aud_Write_String(tx_test_bf,2);

    tx_test_bf[0] = 0xB8;   // Write Config Register
    tx_test_bf[1] = 0x03;   // VOLC : 11.3.4 VOLC –Volume Control
    tx_test_bf[2] = aud_vol;
    SPI_Aud_Write_String(tx_test_bf,3);
/*    
    tx_test_bf[0] = 0x03;   // VOLC : 11.3.4 VOLC –Volume Control
    tx_test_bf[1] = 0xFF;
    SPI_Aud_Write_String(tx_test_bf,2);
*/
    tx_test_bf[0] = 0x02;   // CFG_REG2 –Compression Source
    tx_test_bf[1] = 0x44;
    SPI_Aud_Write_String(tx_test_bf,2);
    
    tx_test_bf[0] = 0xA6;   // PLAY_VP
    tx_test_bf[1] = 0x00;
    tx_test_bf[2] = aud_index;         // M_단선bell_2_VP19 19
    SPI_Aud_Write_String(tx_test_bf,3);
    
    tx_test_bf[0] = 0x12;   // Power Down
    SPI_Aud_Write_String(tx_test_bf,1);
    
    while( (SPI_Aud_Read(0x40) & 0x40) == 0);
    sprintf(tx_buf,"Index : [%02X]\n\r",aud_index);
    UART_1_UartPutString(tx_buf);
}


다은은 Audio IC SPI Write 함수 입니다.
void SPI_Aud_Write_String(uint8_t *write_buf,uint8_t cnt_buf)
{
    uint8_t i,dummy;
    AUD_CS_Write(0);
    CyDelay(10);
    for (i=0;i
    {
        SPIFLASH_SpiUartWriteTxData((uint32)write_buf[i]);     // dummy
        while(SPIFLASH_SpiIsBusBusy());
        dummy = (uint8_t)SPIFLASH_SpiUartReadRxData();
    }
    CyDelay(10);
    AUD_CS_Write(1);
}


다음은 Audio SPI Read 함수 입니다.
uint8_t SPI_Aud_Read(uint8_t REG_cmd)
{
    uint8_t rtn_data[10];
    char tx_buf[100];
    AUD_CS_Write(0);
    SPIFLASH_SpiUartWriteTxData((uint32)REG_cmd);     // instruction
    while(SPIFLASH_SpiIsBusBusy());
    SPIFLASH_SpiUartWriteTxData((uint32)0x00);     // dummy
    while(SPIFLASH_SpiIsBusBusy());
    AUD_CS_Write(1);
    rtn_data[0] = (uint8_t)SPIFLASH_SpiUartReadRxData();
    rtn_data[1] = (uint8_t)SPIFLASH_SpiUartReadRxData();
    
    return rtn_data[1];
}

[PSOC] PSOC4 CAPSENSOR Tunning

안녕하세요,

이번에는 PSOC의 대표적인 기능인 CAPSENSOR 에 대해서 알아보겠습니다.
제가 해 본 기능으로는 CAPSENSOR 터치 스위치와 약 10센치 정도 거리의 사람을 인식할 수 있는 Proximity 기능입니다.

CAPSENSE 는 말 그대로 콘덴서의 성격을 많이 띠는 것 같습니다.
그리고 아날로그 입력의 특성을 갖고 있습니다. 아날로그 입력을 갖고 있고 작은 신호를 증폭해서 인식을 하기 때문에 
매우 민감합니다.
그래서 튜닝을 잘 해야 제대로 성능이 나오는 것 같습니다.

저는 PSOC을 쓰면서 거의 CAPSENSE 기능을 사용하지 않았는데, 외주 개발을 하다 보니 
터치 스위치 기능을 많이 요구해서 어쩔 수 없이 사용해 보게 되었습니다. 
CAPSENSE 기능은 PSOC에서 처음 사용해 보았고, PSOC5,PSOC4 에서 동작시켜 보았습니다.

CAPSENSOR 사용법은 너무 방대하고(메뉴얼 내용이 정말 많음) 다양해서 여기서 자세한 설명은 못 하겠습니다.
그래서 동작 방법과 튜닝 방법만 우선 설명 드리겠습니다.

1. CAPSENSOR 만드는 방법.
먼저 CAPSENSOR PCB 패드를 기판에 위치시켜야 하는데, 제가 해 본 바로는 동그랗고 적당히 큰(지름 5~10mm 정도) 것이 좋습니다. 간격도 가능한 서로 많이 떨어져 있는 것이 좋습니다. 
너무 작거나 서로 간격이 좁으면 인식이 잘 안되거나 옆의 키를 눌렀는데 키가 눌러진 것으로 인식될 때가 있습니다.


위 그림에서 Guard Sensor 라는 것이 있는데, 이것은 물이 묻어도 정상 동작을 하게 하기 위한 보조 기능입니다.
방수 기능이라고 설명이 되어 있는데, 표현이 좀 이상하네요. ^^

여기까지 HW 설명이였고요, 자세한 내용은 메뉴얼을 찾아 보시면 좋겠습니다. 자료가 너무나 많습니다.

SW 에서는 topDedign.cysch 탭에서 CapSense CSD 콤포넌트를 끌어다 놓습니다.


우측에 EZI2C는 나중에 CAPSENSOR 튜닝할 때에 디버거와 I2C 통신으로 연결하기 위해 필요한 콤포넌트 입니다.
위의 테스트는 프로그램은, 예제 프로젝트 중에서 가져다가 좀 수정한 것이고 소스는 정말 간단합니다.
실제로 동작하는 코드와 튜닝하는 코드가 다르므로, 
튜닝할 때는 프로젝트를 따로 1개 만들어서 CAPSENSOR의 포트만 맞게 설정하여 테스트하시기 바랍니다.

이 글을 시작은 했는데, 짧게 끝날 내용이 아니네요. ㅜㅜ

일단 튜닝 쪽만 다뤄야겠습니다.

다음은 CAPSENSE 콤포넌트의 설정입니다.
General tab 은 다음과 같습니다. default 로 표시한 부분이 CAPSENSOR 콤포넌트의 기본 세팅인데 튜닝 시 설정은 조금 다르네요.


그 다음으로 Widget tab 으로 가면, 좌측 상단의 + 버튼을 눌러서 여러 종류의 터치스위치를 추가, 제거(선택해서 Delete 키) 할 수 있습니다.

각각의 터치 스위치를 선택하면 CAPSESE 의 감도와 인식 Threshold 값 및 노이즈 처리값 등등을 바꿀 수 있습니다.
Scan resolution 을 높이면 감도가 높아져서 좀 더 정밀하게 값을 세팅할 수 있고, 보통 터치센서와 사람의 손가락 사이에 플라스틱 같은 소재로 거리를 띄워서 사용하는데, 감도를 높여야 어느정도 거리에서 손가락을 댔을 때 인식을 합니다.

다음은 Scan order tab 인데, 이부분은 자세히 조사를 못해봤습니다. 나중에 보충하겠습니다. 
현재는 전체 스캔 시간 정도만 참고하고 있습니다.

다음은 Advanced Tab 입니다. 이 부분은 HW 설계와도 좀 관련이 있습니다.
shield 센싱 핀의 유무에 따라서 shield 를 Enable/Disable 할 수도 있고,
Shield Tank Cap 의 사용 유무에 따라 Shield Tank Capacitor 를 Enable/Disable 할 수 있습니다.
Guard sensor 는 water proof(방수) 기능을 추가할 경우 HW에서 패턴으로 터치 센서를 감싸도록 설계한 후에 사용하는 기능이고,
나머지 부분은 아직 제대로 파악을 못했습니다. 나중에 자세한 내용 추가하겠습니다.

다음은, Tunning Helper Tab 입니다.
여기서 Enable tune helper 를 체크해야 튜닝 기능을 사용할 수 있습니다.
컴퓨터에서 튜닝 앱을 실행시켜서 PSOC IC 와 연동해서 동작시켜야 하는데, I2C 통신을 사용합니다.
따라서 EZI2C 콤포넌트를 추가해서 EZI2C 콤포넌트 이름을 Instance name for the SCB component 에 넣어 줘야 합니다.

이렇게 전부 설정했으면, EZI2C 콤포넌트의 설정을 또한 살펴봅시다.
configuration tab은 EZI2C 를 선택하면 되고,

EZI2C Basic TAB 에서 기억할 것은 Primary slave address(7-bit) 에 해당하는 주소하고,
Sub-address Size(bit) 는 16 bit 로 설정하는 것으로.. EZI2C 설정은 이 2가지 외에는 신경 쓰실 필요는 없습니다.

이렇게 설정을 하면 모두 끝난 것입니다.

튜닝용 소스코드는 모두 똑같습니다.
main.c 에 있는 main() 함수 내용 몇 주만 추가하면 됩니다.

int main()
{
    /* Enable global interrupts */
    CyGlobalIntEnable;
    
    /* Initialize CapSense CSD and EzI2C Start the sensor scanning loop */
    CapSense_CSD_TunerStart();
    
    while(1u)
    {
        /* Process scanning results and communicates with Tuner GUI */
        CapSense_CSD_TunerComm();
    }
}

컴파일해서 프로그램을 다운로드하고,
디버거의 I2C 신호(SCL,SDA)를 PSOC4 의 핀에 맞게 연결을 합니다.



PSOC Creator 의 TopDesign.cysch 탭에서 CAPSENSE 컴포넌트를 선택하고 마우스로 우클릭 해서 Launcher Tunner 를 실행하면 튜닝 앱이 실행됩니다.


튜닝 앱 실행.


여기서 끝이 아니죠. 설정에서 I2C 어드레스 및 관련 설정을 맞춰야 합니다.
이전에 CAPSENSE 의 EZI2C 의 주소(0x08)와 Subaddress 길이를 서로 맞춰 주고 튜닝 툴의 좌즉 상단의 Start 버튼을 눌러주면 실시간으로 값을 바꿔보면서 튜닝을 진행하실 수 있습니다.


튜닝은 많이 해보면서 적당한 값들을 찾아가면 됩니다.
나중에 튜닝했던 데이터를 본 프로그램에 적용하면 큰 문제없이 동작할 겁니다.

[소스코드 링크]

[PSOC] PSOC4 4100M에서 내부 FLASH data Memory 사용하기

지금까지 PSOC5,PSOC4 4200 을 사용하다가 이번에는 PSOC4 4100M 시리즈를 사용하게 되었습니다.


EEPROM 처럼 비휘발성 메모리를 사용하는 방법이 각각 달랐습니다.
(아.. 제가 사용한 방식이 각각 다 달랐다고 말씀드려야겠습니다.)
1. PSOC5는 EEPROM 과 emulate EEPROM 2가지를 사용할 수 있고,
2. PSOC4 4200 시리즈는 emulate EEPROM을 사용할 수 있었고,
3. PSOC4 4100M 시리즈는 Flash Memory 를 EEPROM 처럼 사용할 수 있었습니다.


PSOC4 4200 시리즈까지는 콤포넌트가 있으니까, 예제 불러다가 바로 이식해서 쓰는데 어려움이 없었는데,
PSOC4 4100M 시리즈는 콤포넌트 자체가 없어서 알아 보는데 시간이 좀 걸렸습니다.

SFlash 라는 메모리 영역이 있는데 바로 이 영역에 데이터를 쓰고 읽는 방법이 있었습니다.
PSoC 4 implements a User Supervisory Flash (SFlash), which can be used to store application-specific information.
These rows are not part of the hex file; their programming is optional.

나중에 예제를 검색해 보니 SFlash Write/Read 예제도 있었습니다.
PSOC 이 너무 쉬웠는데, 갑자기 콤포넌트에 없는 예외의 내용이 나오니까 잠시 허둥대 버렸네요. ^^



예제 내용을 보니까, 간단했습니다.
1. PSOC4 에는 User SFLSH 영역이 있고, 그 Address 는 0x0FFFF200 번지이다.
2. User SFLASH 의 영역를 구분하는 단위는 row 라고 부르고, 4개의 Row를 User SFLASH로 사용할 수 있다.
3. 1개의 Row는 128 Byte 이므로, 128 x 4 = 512 Byte 의 User SFLASH 를 EEPROM 처럼 사용할 수 있다.
4. 예제를 보니, 데이터는 1 Row 단위로 쓰는데.. 일반 Serial Flash 메모리 처럼 128 Byte 를 1 block 으로 생각하고
1 block 를 Erase 한 뒤에 다시 쓰는 방식으로 생각된다. 윈본드 serial Flash를 쓸 때를 예를 들자면, 지우지 않고 쓰면(Write) 값이 변하지 않는다. 그리고 쓸 때는 block(또는 sector) 단위로 쓴다.



SFLASH는 컴포넌트가 필요 없고, SFLASH를 사용하려면 다음과 같은 코드를 실행합니다.
    SPIFLASH_SCBCLK_Start();
    SPIFLASH_Start();



아, 위의 코드 이전에 어드레스 정의와 임시 데이터 저장 공간을 위해 SRAM 메모리 변수를 확보해야 겠습니다.
// Defines last ROW of SFlash 
#define CY_DOOR_SFLASH_ROW       (CY_SFLASH_NUMBER_USERROWS - 1u)
// Defines absolute address of ROW 
#define CY_DOOR_SFLASH_ADDR      (CY_SFLASH_USERBASE + CY_DOOR_SFLASH_ROW * CY_SFLASH_SIZEOF_USERROW)

// SRAM 메모리 130개 (130-Byte),,   > 1 block(128-byte)
uint8_t card_key_data[13][10];

(의의 코드 설명)
디게 복잡하게 보이네요. CY_SFLASH_NUMBER_USERROWS 는 PSOC 에서 이미 만들어진 h 파일에 4라고 되어 있으니,
CY_DOOR_SFLASH_ROW 은 4-1 로 3이네요.

PSOC4 의 User SFLASH 로 사용할 수 있는 Row 값은 0~3 으로 4개이고, 그 중에 3번 Row(CY_DOOR_SFLASH_ROW)를 사용한다는 말이지요.
(예제를 그냥 베껴 썼더니, 복잡해져 버렸다. ^^ 죄송)


CY_SFLASH_USERBASE 는 PSOC 에서 이미 만들어진 h 파일에 0x0FFFF200u 로 User SFLASH 메모리의 시작 Address 입니다. CY_SFLASH_SIZEOF_USERROW 는 128 Byte(1 Row의 구성 단위)이므로 3번 Row의 시작 어드레스는 CY_DOOR_SFLASH_ADDR 으로 정의된 내용입니다.




[SFLASH 읽기/쓰기]
SFLASH에 데이터를 쓰는 과정은 다음과 같습니다.
1. 쓸(Write) 데이터를 1-row 단위(128-Byte)로 임시 저장 변수에 넣는다.
2. returnValue = CySysSFlashWriteUserRow(CY_DOOR_SFLASH_ROW, &card_key_data[0][0]); 의 예제 코드처럼, CySysSFlashWriteUserRow 함수에 입력으로 Row 번호 와 임시저장 변수의 시작 어드레스를 넣으면 출력으로 CY_SYS_SFLASH_SUCCESS 가 return되면 쓰기(Write)성공, 다른 값이 리턴되면 실패로 처리하면 됩니다.

SFLASH에서 데이터를 읽는 과정은 다음과 같습니다.
그냥 해당 어드레스의 값을 읽으면 됩니다. 아무 제약이 없습니다. 일반적으로 어드레스에서 데이터 읽기와 똑같습니다.
다들 아시죠?

이렇게 읽으면 p_mem_data 에 SFLASH의 해당 address의 값이 들어가게 되겠죠? ^^
uint8_t p_mem_data;
uint32_t cnt_sf=0;
p_mem_data = (*((uint8 *) (CY_DOOR_SFLASH_ADDR + cnt_sf)));





프로젝트 예제는 생략합니다. 프로젝트를 만들 때, 예제를 선택해서 SFLASH로 검색하면 예제 프로젝트 나옵니다.
저도 예제 프로젝트 변경해서 썼습니다. ^^

2016년 5월 19일 목요일

저렴한 부저 대용 스피커 구동 IC : ISD2130

nuvoton 사의 스피커 구동 IC 를 소개합니다.

내부에 메모리가 들어 있고, 재생하려고 하는 음원 파일을 PCM 파일로 변환해서 칩 내부 메모리에 저장할 수 있습니다.
그리고 내부의 음성 파일은 SPI 명령이나, SPI 통신으로 I/O 핀과 연결되도록 설정해서 I/O 핀 입력으로 핀과 매칭시킨 음성을 재생할 수 있습니다.

SPI 통신으로 "플레이+음성 인덱스" 명령만 주면 해당하는 인덱스의 음성을 재생할 수 있으므로 
매우 간단합니다.

부저보다 좀 비싸지만, 부저급의 소리하고는 급이 다른 음향이나 사람 목소리 등을 재생할 수 있습니다.

가격은 600 원 정도 한다고 합니다. 증폭 회로는 IC 내부에 다 들어 있어서 스피커만 붙이면 됩니다.
마이크 입력은 없습니다.

앞으로 자주 사용하려고 합니다. ^^.

제가 며칠 뒤려나? 시간 나면 PSOC4에서 구동한 내용 설명과 합께 올려 보겠습니다.



소리 재생한 동영상 올려 봅니다.

2016년 5월 5일 목요일

[PSOC] PSOC5 CAPsense 기능으로 부트로더 셀렉트, APP

@@ 술먹으면서 프로그램 짜다가 더이상은 안되서 글을 못쓰고 동영상을 올려보겠습니다.

부트로더를 동작하게 하려고 할 때, 터치 스위치를 이용하려고 했다가 
특정 스위치를 누르고 부트로더로 진입하려고 했었는데, 안되네요. 뭔가 실수가 있겠죠.

시간이 없어서 그냥 2초 내에 터치를 누르면 부트로더로 진입하도록 프로그램했습니다.

에구... USB_UART 기능도 나중에 손봐야 하는데, 현재는 버튼을 누르면 USB_UART 로 진입하도록 했습니다.
나중에는 아무 때나 USB_UART를 사용할 수 있게 할 예정입니다.(시간이 너무 없어서요. 그런데 난 술먹고 취해버렸군요. ㅜㅜ)

터치 스위치로 부트로더로 진입해서, 터치 스위치로 USB 통신 모드로 또 진입하고, 터치 스위치로 IO 제어를 하는 것을 
동영상으로 찍어서 보여 드리겠습니다. 이젠 자러 갑니다. ^^


2016년 5월 2일 월요일

[PSOC] PSOC5 (CY8CKIT-059) 에서 USB 부트로더 5분만에 만들기

안녕하세요. 오랜만입니다.

아직도 엄청 바쁘군요. 프로젝트를 동시에 4개를 하다보니 전혀 시간이 안나네요.

잠깐 부트로더를 1개 만드는 중이라 만들면서 올립니다.

PSOC5 에서 USB 포트를 사용한 부트로더를 만드는 내용인데 정말 간단합니다.

먼저 PSOCCREATOR 를 실행하여, 새로운 프로젝트를 만듭니다.
Target Hardware 는 KIT를 사면서 깔아둔 프로그램에 의해 키트이름이 목록에 나와 있어서 선택하고요, 없으면 디바이스명으로 검색해서 선택하면 됩니다.(1만원이면 1개 사니까 사두시면 여러모로 공부하기 좋습니다. 저는 10개씩 디지키에서 삽니다. 사면 여기저기 사용하다보면 금방 다 떨어지네요.^^)


프로젝트를 만들때, 예제를 기반으로 만들어 봅니다. 예제에 부트로더가 들어있습니다. ^^


필터 검색란에 usb 를 치면 USBFS_Bootloader 가 있으니 선택하고 다음으로..

이름 적당히 정하고 퓌니쉬 눌러줍니다.


그러면 간단한 부트로더가 만들어집니다.

안고치고 쓰셔도 되지만, 이 프로그램은 처음 파워온 리셋 시, 10초동안 부트로더 프로그램이 동작합니다.
10초가 지나면 응용프로그램이 동작하는데, 이건 뭐... 어떨 때 보면 어머어마한 시간이죠.
사용자가 답답해 할 정도이니, 좀 고치죠.

물론 10초를 2초 정도로 고쳐도 됩니다. 그런데, 제가 많이 써 본 결과 2초내에 부트로더를 이용해 다운로드 시작을 해 줘야 부트로더가 동작하는데 좀 늦으면 다시 번거롭게 파워온 리셋을 시켜줘야 합니다.

그래서 준비한 것이 아무 버튼이나 하나 연결해서 버튼을 누르고 파워를 키면 바로 부트로더로 들어가고, 누르지 않고 파워를 키면 바로 응용프로그램을 시작하도록 하였습니다.
먼저 Topsch 를 다음과 같이 바꿉니다. ( 스위치 입력만 1개 추가)

그리고 main.c 에 다음의 코드를 추가합니다.
int main()
{
    /* Indicates that the bootloader is running. */
#if (CY_PSOC4)
    RGB_LED_ON_RED;
#else
    TURN_ON_LED4;
#endif /* (CY_PSOC4) */

if((Wait_Forever_Read() == 0/*Pressed*/) || (Bootloader_GET_RUN_TYPE == Bootloader_START_BTLDR))
{
Bootloader_SET_RUN_TYPE(Bootloader_START_BTLDR);
}
    /* Enters the bootloader to wait for the application update. */
    Bootloader_Start();

    /* Bootloader_Start() never returns. */
    for (;;)
    {
    }
}

아, 그리고 아까 topsch 탭에서 부트로더를 더블클릭하면 나오는 옵션에서, Wait Time 을 10초에서 적당히 작게 100ms 정도로 바꿔 주면 스위치를 누르지 않으면 응용프로그램이  즉시(100ms 후)에 실행 됩니다.


자.. 다들 5분 걸리시나요? ^^. 전 4분 걸렸습니다. 
으.. 시간이 없어서 곧 부트로더블도 설명해 보겠습니다. 부트로더블은 아마도 1분 걸립니다. ^^
하지만 글 쓰는 것은 20~30분 이상 걸리네요.

예제 프로젝트도 올립니다.