페이지

글목록

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

2017년 2월 13일 월요일

[PSOC5] EEPROM 테스트

PSOC5 는 EEPROM 테스트 관련 글이 없어서 약간 시간을 내서 글을 올려 봅니다.

물론 예제에서도 참고할 수 있는데, 예제가 너무 복잡해 보이네요.
또한 제가 사용할 때는, EEPROM 을 따로 Erase를 할 필요가 없었는데.. 
예제에서는 항상 Erase를 하고 Write를 하는게 좀 이상했습니다.

이번에 테스트한 보드는, Cypress에서 많이 파는 CY8CKIT-059 로 진행했습니다.
사용한 콤포넌트는 Port 입력 1개(TACT Switch)와 UART 만 사용했습니다.

byte(unsigned char) 타입 데이터 2개와 uint(unsigned 16 bit) 타입 데이터 2개를 스위치를 1번 누를 때마다,
1씩 증가하도록 하고 EEPROM 에 저장을 했습니다.
그리고 리셋 버튼을 누르면 EEPROM에 저장된 값을 UART 로 출력해서 EEPROM의 동작을 확인했습니다.

보드의 외형과 사용하는 포트들은 다음과 같습니다.



다음은 PSOC Creeator 의 컴포넌트 설계도입니다. (TopDesign.cysch)


다음은 실제 PSOC5 IC의 사용하는 포트입니다.



다음은 프로그램 테스트 과정입니다.

1. 처음 프로그램을 다운로드하고 UART 로 출력되는 내용 (EEPROM에 저장되는 값들을 초기화하여 Write 한다)



2. 스위치를 3번 눌러서 값을 3증가시켜서 저장하고 UART로 출력. 리셋 버튼을 눌러 EEPROM 값을 읽어 확인.



3. 전원을 OFF --> ON 해서 정말로 데이터가 남아 있는지도 확인.


psoc 소스 코드 첨부합니다.

2016년 12월 14일 수요일

[PSOC5] SD Card I/F (SPI 방식)

안녕하세요, 

이 글은 예정에는 없었지만, 카페에 올린줄 알았는데 없어서 글을 쓰게 되었습니다.

PSOC5에서 micro SD-Card 를 사용하는 방법인데, PSOC5은 SDIO 가 없어서 SPI 방식만 지원합니다.
속도는 24Mhz 입니다.
제가 보기에는 현재까지 PSOC5가 MCU 중에서 가장 사용자 친화적으로 잘 만들어 진 것 같은데,
패키지가 다양하지 않고 후속 모델(PSOC6)이 안나오며, PSOC4만 계속 손데고 있어서 매우 불만이 많습니다.
가격은 요새 좀 내려간 듯 한데, STM32F4xx 에는 가성비가 못미치네요.
PSOC5 이대로 죽는겐가? ㅜㅜ

아.. 헛소리를 많이 했군요. 
그럼 다시 PSOC5에서 SPI 방식으로 SD Card 제어하는 방법을 알아보겠습니다.
PSOC Creator 의 TopDesign.cysch 에 emFile SPI Mode[V1.20] 콤포넌트를 배치하고 
emfile 콤포넌트의 Datasheet를 보면 여기서 설명하려는 내용이 영문으로 나와 있습니다.


1. PSOC Creator 내부에 File System 라이브러리가 없기 때문에 먼전 File System 라이브러리를 다운로드 받아야 합니다.
여기(링크)에서 다운로드 받으시면 됩니다.

2. 받은 파일을 압축을 풀어서 적당한 위치에 놓으십시요. (저는 프로젝트 폴더 옆에 놓았습니다)

3. 콤포넌트 창에서 Communication->FileSystem->emFile 을 TopDesign.cysch 으로 끌고 와서 배치합니다.



4. 왼쪽 Workspace Explorer 의 Project 를 우클릭하여 Build Setting 을 클릭합니다.



5. Include Directory 를 추가




6. 라이브러리 이름 추가. 직접 타이핑해 줍니다.
emf32noslfn 를 타이핑 하고, 이 의미는 No OS , Long File Name 의 의미입니다.



7. 다음은 라이브러리가 있는 디렉토리를 추가합니다.



8. 라이브러리 파일을 추가합니다.



9. 회로를 보고 핀을 배치합니다. (PSOC5는 이것이 장점 : 핀을 맘대로 옮길 수 있습니다.)
디버깅용으로 USB Serial 포트도 하나 넣었습니다.




10. micro-SD 카드 회로도는 다음과 같습니다. 신호에 굳이 풀업저항은 필요 없었습니다.
혹시나 해서 테스트 해 봤는데 잘 되네요.



11. SD 카트에서 데이터를 읽어서 뿌려볼라고 하는데, 구글링해서 "영문 텍스트 소설" 검색하니 해리포터 불의잔이 있네요. ^^
다운받아서 SD Card에 넣습니다.




12. 제작한 기판에 SD Card를 끼웁니다. 회사에서 만든 기판은 다음과 같습니다.




이제 프로그램만 짜면 되는데 불의잔을 읽어서 USB Serial로 터미날에 5000 바이트만 뿌려 보겠습니다.
먼저 결과를 올려 보겠습니다.



잘 읽히네요. 불의 잔. ^^

소스코드는 main.c 에만 코드를 추가했고, SD Card 읽기만 테스트 해 봤습니다.
나머지는 현재까지 읽기 이외의 작업이 필요없었던 관계로 회원 여러분이 찾아서 해 보십시요. ^^
프로젝트 압축해서 첨부합니다. 그런데 emfile 라이브러리는 PSOC Creator에서 한번에 압축을 안해 주네요.
아마도 4~8 과정을 회원분들께서 다시 해 주셔야 될 것 같습니다.

프로젝트 파일 (링크)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "project.h"
#include <stdio.h>
#include <FS.h>
#define BUFFER_LEN  64u
struct tagFILE
{
    uint8 accmd;
    uint32 sz;
    FS_FILE* fp;
    char tFileName[64];
};
static struct tagFILE   tFILE;
char8 *parity[] = { "None""Odd""Even""Mark""Space" };
char8 *stop[] = { "1""1.5""2" };
void ready_USB_UART_tx(void);
int main(void)
{
    uint8_t buffer[5000];
    uint16_t i;
    char usb_tx[BUFFER_LEN];
    
    
    FS_Init();
    FS_Mount(0);
    FS_FAT_SupportLFN();
    
    CyGlobalIntEnable; /* Enable global interrupts. */
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    
    CyDelay(500);
    
    FS_DIR*     pDir;
    USBUART_1_Start(0u, USBUART_1_3V_OPERATION);
    ready_USB_UART_tx();
    pDir = FS_OpenDir("");
    sprintf(tFILE.tFileName,"Harry_potter_Goblet_of_Fire.txt");
    tFILE.fp = FS_FOpen(tFILE.tFileName, "rb");
    tFILE.sz = FS_GetFileSize (tFILE.fp);
    sprintf(usb_tx,"File size : %5lu\n\r",tFILE.sz);
    while(USBUART_1_CDCIsReady() == 0u);    /* Wait till component is ready to send more data to the PC */ 
    USBUART_1_PutString(usb_tx);       /* Send data back to PC */
    
    FS_FSeek(tFILE.fp,0,0);
    FS_Read(tFILE.fp, buffer, 5000);
    for (i=0;i<5000;i++)
    {
        while(USBUART_1_CDCIsReady() == 0u);    /* Wait till component is ready to send more data to the PC */ 
        USBUART_1_PutChar(buffer[i]);       /* Send data back to PC */
    }
    //proc_USB_UART();
    for(;;)
    {
        /* Place your application code here. */
    }
}
void ready_USB_UART_tx(void)
{
    uint16 count;
    uint8 state,led_st=0,cnt_USB_UART_con=0;;
    uint8 buffer[BUFFER_LEN];
    char tx_buffer[BUFFER_LEN];
   /* Main Loop: */
    for(;;)
    {
        if(USBUART_1_IsConfigurationChanged() != 0u) /* Host could send double SET_INTERFACE request */
        {
            if(USBUART_1_GetConfiguration() != 0u)   /* Init IN endpoints when device configured */
            {
               /* Enumeration is done, enable OUT endpoint for receive data from Host */
                USBUART_1_CDC_Init();
            }
        }         
        if(USBUART_1_GetConfiguration() != 0u)    /* Service USB CDC when device configured */
        {
            if(USBUART_1_DataIsReady() != 0u)               /* Check for input data from PC */
            {   
                count = USBUART_1_GetAll(buffer);           /* Read received data and re-enable OUT endpoint */
                if(count != 0u)
                {
                    while(USBUART_1_CDCIsReady() == 0u);    /* Wait till component is ready to send more data to the PC */ 
                    USBUART_1_PutData(buffer, count);       /* Send data back to PC */
                    /* If the last sent packet is exactly maximum packet size, 
                    *  it shall be followed by a zero-length packet to assure the
                    *  end of segment is properly identified by the terminal.
                    */
                    if(count == BUFFER_LEN)
                    {
                        while(USBUART_1_CDCIsReady() == 0u); /* Wait till component is ready to send more data to the PC */ 
                        USBUART_1_PutData(NULL, 0u);         /* Send zero-length packet to PC */
                    }
                }
            }  
            
            state = USBUART_1_IsLineChanged();              /* Check for Line settings changed */
            if(state != 0u)
            {  
                if(state & USBUART_1_LINE_CODING_CHANGED)   /* Show new settings */
                {
                    sprintf(tx_buffer,"BR:%4ld,DB:%d\n\r",USBUART_1_GetDTERate(),(uint16)USBUART_1_GetDataBits());
                    sprintf(tx_buffer,"SB:%s,Parity:%s\n\r", stop[(uint16)USBUART_1_GetCharFormat()], \
                                                         parity[(uint16)USBUART_1_GetParityType()]);
                }
                if(state & USBUART_1_LINE_CONTROL_CHANGED)  /* Show new settings */
                {   
                    state = USBUART_1_GetLineControl();
                    sprintf(tx_buffer,"DTR:%s,RTS:%s\n\r",  (state & USBUART_1_LINE_CONTROL_DTR) ? "ON" : "OFF", \
                                                        (state & USBUART_1_LINE_CONTROL_RTS) ? "ON" : "OFF");
                    cnt_USB_UART_con++;
                    
                    if (cnt_USB_UART_con > 1)
                        break;
                }
            }
        }
    }   
}
cs

2016년 10월 31일 월요일

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

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

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

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





2016년 10월 13일 목요일

[cc1310] Port 변경

개발키트에는 USB to UART 디버거 칩에 연결되어서 다른 MCU에 연결해서 테스트를 할 수가 없어서 
UART 포트를 옮겨봤습니다.




[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 모델인 것 같습니다.

[CC1310] cJTAG 로 디버깅 핀 수를 줄일 수 있습니다.

처음에 CC1310 32핀 IC를 쓰려고 하는데, JTAG로 설계하니 핀이 좀 많이 소비된다 싶어서
메뉴얼을 찾아보니 cJTAG라는 방식이 있었습니다.

자세한 설명은 메뉴얼을 보시고, 어떤 핀을 연결하는지와 실제로 동작하는지를 알아봤습니다.



2016년 10월 12일 수요일

2016년 8월 18일 목요일

장난감 구입 했습니다.

이번에 새로 구입한 장난감입니다. ^^

새로 산 장난감 목록은 다음과 같습니다.
1. STMicro 사에서 나온 레이저 거리 측정 센서와 3각 측량법 알고리즘을 구현하기위한 MCU 보드(STM32F401) 

2. TI 에서 새로 나온 Sub-1GHz 대역 주파수를 사용하는 RF 통신 MCU (CC1310 : Cortex-M3) 키트 2셋


3. 라즈베리파이 3

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

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