페이지

글목록

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분 이상 걸리네요.

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

[PSOC] PSOC5 1분만에 USB 부트로더블 APP 만들기.

이번에는 1분만에 만드는 부트로더블 APP 입니다.

이전에 USB 브트로더를 만들었는데, 이번에 만들 APP 에서 부트로더 HEX 파일을 이용할 것입니다.
간략하게 말하면 기존 APP 의 TopDesign.cysch 탭에 부트로더블을 추가하고,
기존에 만든 부트로더의 HEX 파일을 연결해 주고 컴파일하여 Bootloader Host 라는 툴로 다운로드해 주면 됩니다.

이정도로 이해가 되면 좋겠지만, 조금 더 설명을 드리겠습니다.

앱을 그냥 예제를 이용해서 만듭시다.


2. 아무 예제나 1개 불러 오겠습니다.

3. 그냥 만만한 systick 예제를 선택했습니다.


4. 자자.. 다음,finish 눌러 주면 다음과 같은 topdesign.cysch 가 보입니다. 아직 브트로더블 상태가 아닙니다.

5. system 의 부트로더블 콤포넌트를 끌어다 아무 자리에나 놓습니다.

6. 여기서 1가지만 더 추가하면 됩니다.
부트로더블 콤포넌트를 더블큭릭하고, Denpendencies 탭을 선택한 다음, 이전에 만들어 놓았던 부트로더의 결과물인 HEX 파일과 ELF 파일을 찾아서 연결해 줘야 합니다.


7. 잘 찾아서 연결합시다. 다음 위치에 기존의 bootloader를 컴파일하면 자동으로 만들어 집니다.
...\USBFS_Bootloader\USBFS_Bootloader\USBFS_Bootloader.cydsn\ARM_GCC_493\Debug


8. HEX 파일만 찾아서 연결하면 ELF는 자동으로 연결되니, ELF까지 찾아서 연결하진 마시고요.
이렇게 한 후, 컴파일만 해 줍니다. 디버거 연결한 체로 프로그램 버튼 누르시면 기존에 넣어 두신 부트로더 지워지니 조심하십시요.


9. 툴 메뉴의 bootloader Host 를 선택합니다.


10. 부트로더 호스트 프로그램이 새 창으로 실행됩니다. 아 .. 그전에 PSOC 059 키트의 USB 포트에 PC와 연결합니다.
저도 가끔 실수하는데, 이 059 KIT는 디버거와 타겥보드가 한몸이라 USB 포트에 타겥보드를 연결한 걸로 실수를 하는 경우가 많네요.




11. 이렇게 연결해 놓고 Bootloader Host를 실행하면, USB Human Interface Device (04B4_B71D) - USB 라는 장치가 보일 것입니다. 선택하세요.


12. 좀 전에 부트로더블 콤포넌트를 추가해서 만든 APP 를 컴파일해서 나온 cyacd 확장자로 된 파일을 다운로드할 파일로 선택합니다.
참고로 부트로더블로 설정된 APP는 디버깅이 안됩니다. 디버깅하려면, 부트로더블 콤포넌트를 제거해야 합니다.
또, 부트로더블 APP 은 디버거로 프로그램할 수도 있습니다. 하지만 부트로더가 내부에 들어 있으면 지워지고, 일만적인 APP 프로그램 다운로드한 것과 같은 상태가 됩니다.

13. 이제 프로그램 버튼을 누르면 부트로더에 의해 Bootloaderble APP 프로그램이 다운로드 됩니다.
다운로드가 다 되면, 자동으로 리셋되어 실행이 되고요.


14. 부트로더가 다운로드 되면 HID 가 없어집니다. 부트로더가 동작해야 HID가 나타나는데, 현재 APP이 동작하니까 없어지는 것이 당연하겠죠.



15. 프로그램 동작을 확인해 보니 잘 동작 합니다. 혹시 059 kit 로 설정했는데, 저처럼 device 가 cy8c5868 로 되고, 포트도 엉뚱한 핀으로 설정된 분은 cydwr 탭에서 핀설정 다시 하시면 됩니다. 프로그램은 LED 출력이 2개인데, 실제 보드에는 LED가 1개뿐이라서, 1초마다 토글하는 출력에 LED를 연결했습니다.

16 끝으로, 다시 다른 APP 프로그램을 다운로드 하려면 이전에 부트로더 동작 방법인 스위치를 누른 상태에서 리셋을 하면 Bootloader Host 툴에 HID가 보일 것이고 파일을 선택해서 다시 다운로드 하면 됩니다.,
이것으로 원격 다운로드도 가능합니다. 찾아보시면 부트로더 윈도우 소스코드도 있으니, 비주얼 스튜디오 하실 줄 아는 분은 적당한 프로그램을 만들어서 쓰셔도 됩니다.

이상 ... 끝. 1분만에 부트로더블 프로그램을 만들 수 있지만, 이렇게 글을 쓰는 것은 1시간이 넘게 걸리네요. ^^

[PSOC] PSOC4 Emulated EEPROM Component 사용기

PSOC4는 PSOC5와 달리 EEPROM Component가 없습니다.

그래서 em_EEPROM Component를 사용해야 하는데,
처음에 아무리해도 동작이 안되는 것이여서 여러가지 사례들을 웹에서 찾아봤는데,
별 도움이 안되는군요. 아마 영어가 딸려서 이해를 못 한 것도 큰 것 같습니다.

그러다가, 혹시 하는 생각에 전원을 껐다 켜니 그제서야 제대로 동작하네요.

제가 행한 프로그램 동작 과정은, em_EEPROM를 디버거를 사용해서 프로그램을 다운로드했었습니다.
em_EEPROM은 내부 플래쉬 메모리를 이용하는 방식인데, 
디버거를 사용해서 프로그램을 할 때, 다운로드할 때 플래쉬를 먼저 모두 지워버리나 봅니다.
그리고 초기 값을 쓰죠.

그러니까, 항상 프로그램을 다운로드 할 때 똑같은 초기값으로 써져서 전혀 em_EEPROM 이 동작하지 않는 것처럼 보이는 것이였습니다.

PSOC4 의 예제 중에서, em_EEPROM 예제가 있는데 잘 동작합니다.
주의하실 점, 다운로드하면 전부 지워지고 초기화된다.

따라서, 동작을 확인하려면 다운로드한 후, 리셋를 꾹 눌러본다.

PSOC5의 EEPROM Component는 디버거로 다운로드해도 지워지지 않는다.
PSOC4는 주의하자~~^^