페이지

글목록

2016년 10월 31일 월요일

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

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

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

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





2016년 10월 23일 일요일

[STM32F4xx] Nucleo 보드 테스트 #17 (SPI Tx DMA:KEIL)

SPI 통신을 DMA로 송신했을 시, 파형이 기존 SPI에 비해 끊김 없이 최대 45MBit/s 로 나옵니다.
DMA를 안 쓰면 데이터 Rate가 절반도 안나왔는데, DMA로 하면 효율이 100% 입니다.

SPI tx 를 DMA로 보냈을 때 파형이 어떤지만 간단하게 설명하고 끝낼 예정입니다. ^^











[STM32F4xx] Nucleo 보드 테스트 #16 (mem to GPIO DMA:KEIL)

이번에는 memory to GPIO 를 DMA로 출력하는 테스트를 할 예정입니다.

타이머 1개를 트리거 신호로 사용하여 65535개까지 연속으로 데이터를 출력할 수 있으며,
속도는 10MHz 내외로 나옵니다.

생각보다 빠르지 않습니다만, 데이터 버스로 사용한다면 80Mbit/s 의 속도가 나오므로 꽤 나오죠?
저는 동시에 여러개의 SPI 버스의 데이터를 송신하는 용도로 사용하려고 테스트를 진행중입니다.
(예전에 테스트를 어느정도 해 놓고, 정리 차원에서 카페에 글을 올리는 중입니다.)

예전에 테스트한 보드는 Nucleo STM32F411 보드에서 했었고,
이번에는 Nucleo STM32F446 보드에서 테스트할 예정입니다.

참고로 한 내용은 st 홈페이지의 AN4666 입니다.

예제 프로그램을 위의 링크된 사이트에서 다운 받을 수 있는데, 회원을 가입해야 했던 것 같습니다.

STM32F476G Discovery 보드의 예제인데, TIM2 의 CH1을 DMA 트리거 소스로 프로그램 되어 있습니다.
하지만 STM32F411,STM32F446 에서는 TIM2/CH1 을 DMA 소스로 했을 때 트리거 신호가 나오지 않는 문제가 발생했습니다.
아무리 해도 안되서 TIM1/CH1 을 트리거 소스로 사용하니 트리거 신호가 동작했습니다.
원인은 모르겠으나, TIM1 과 TIM2 의 큰 차이는 Repetition Count 가 있고 없고의 차이인데 확실히 트리거 신호가 안나오는 이유는 모르겠지만, TIM1/CH1 은 동작합니다. (원인을 알고 계시면 알려 주시면 감사하겠습니다)

다음은, STM32CubeMX 툴로 프로젝트를 만드는 과정을 그림으로 올려 보겠습니다.

먼저 Pinout 탭에서 사용할 기능을 설정합니다.
NuCleo 보드에서 클럭을 8MHz Bypass 틀락과 32.768 KHz 크리스탈을 사용하므로 RCC를 그에 맞게 설정하고,
트리거 소스로 사용할 TIM1 의 Clock Source 를 Internal Clock, 출력 채널을 PWM Generation CH1 으로 설정합니다.
이 때, GPIO 출력으로 사용할 포트는 CubeMX 툴에 표시되지 않습니다.


실제 Nucleo 보드의 출력핀은 다음과 같습니다.

다음은 큐브 툴에서 Clock을 설정합니다. 입력 클럭 8MHz,32.768 KHz 클럭을 소스로 시스템 클럭은 STM32F446 의 최대 클럭인 180MHz 로 설정을 했습니다. 180MHz 를 쓰고 엔터키만 치만 나머지를 자동으로 맞춰주니 골치아파할 필요가 없습니다.


다음은 TIM1 주기와 듀티 및 DMA 설정을 위해서 CubeMX 툴의 configuration 탭을 선택하고 TIM1 을 클릭합니다.

parameter Setting 에서 제 경험상 가장 빠른 출력 주기인 7로 주기를 설정하고, High 로 유지할 펄스는 2로 설정합니다.
주기를 더 빠르게 하면 트리거 출력이 나오다 없어지거나 처음부터 안나옵니다.

다음은 DMA Setting 입니다.
수정할 부분은 Direction 을 Memory to Peripheral 로 고치고, 저는 Data Width를 Byte로 해서 출력 하려고 Byte로 설정했습니다.

이렇게 하고 나서 Keil compiller 프로젝트 형식으로 소스 코드를 만들기 위해 project/Setting 메뉴에서 Toolchain / IDE 옵션을 MDK-ARM V5 로 선택합니다.

그런 다음, project/Generate Code 를 클릭하면 Keil 프로젝트가 만들어 집니다.

main.c 의 main() 함수에 추가한 내용은 아래 붉은색 네모의 내용이 다 입니다.

그런데 가장 중요한 부분은 stm32f4xx_it.c 에 있는 DMA IRQHandler 함수에 TIM1 을 멈추게 하는 코드를 넣어야 한다는 점입니다.
저는 예제를 받아서 수정을 한 것이 아니고, 참고로 해서 CubeMX 툴에서 다시 만들었기 때문에 main.c 파일만 보고 수정된 부분을 비교해서 수정을 했기 때문에 stm32f4xx_it.c 파일을 수정해야 한다는 생각을 못하고 프로그램을 실행하니 아무리 해도 동작이 안되었습니다. 원인은 이 코드를 수정하지 않아서 트리거 클락이 끝없이 나가는 것이 문제였습니다.

그리고 앞뒤고 트리거 클럭은 더미 클럭이 나가니, GPIO를 사용할 경우 주의하시기 바랍니다. SPI로 동작 시킬 경우에는 데이터에 /CS 데이터를 실어서 출력하면 더미데이터를 신경 안 쓰고 사용할 수 있을 것 같습니다.
더미 데이터는 클럭이 빠를수록 더 많이 나옵니다.

다음은 첨부된 프로젝트 파일의 실행 결과 입니다.




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일 목요일

국내 로라 모뎀 일반 용도로 사용기.

저희가 일반적인 용도로 쓰게 수정해 달라고 요청을 해서 받아서 써 봤습니다.

성능이 잘 나왔으면 업체를 소개해 드리고 사진도 올려보고 할 텐데,

너무 성능도 안나와서(송수신 시간이 너무 느리다) 그냥 글로만 쓰고 끝내려 합니다.

거리나 송수신 신뢰도는 괜찮았습니다. 
하지만 AT Command로 데이터를 보내면, 보냈다는 응답이 한 2초 정도 후에 수신이 되고,
2초 이전에 데이터를 다시 보내면 데이터가 제대로 안가거나 아예 송신이 안되는 경우가 있었습니다.

왜 이렇게 만들었나 싶을 정도로 송신 주기가 너무 길게 설정되어 있었고,
구조도 좀 복잡했습니다. 로라 Transceiver IC + ARM-Cortex-M0 로 2칩으로 구성되어 있습니다.

그에 비해 TI Simple-link CC1310 은 1-칩으로 되어 있고, 내부에 M3,M0 코어가 내장되어 있습니다.
크기도 가장 작은 패키지가 4x4 mm 이고,
데이터 송신 주기는 5ms 까지 테스트 해 봤는데 전혀 무리가 없었습니다.

로라 모듈은 모뎀 제작사가 프로그램을 잘 못 만들었거나 전송 주기를 줄일 수 있을텐데 조정을 안해서 나온것 같네요.

일단은 sub-1GHz RF 통신을 목적으로 사용하기에는 TI CC1310 이 더 낫다고 생각이 듭니다.


이건 선택이 틀렸을 뿐, 제품이 나쁜 것은 아닌것 같습니다. 

그냥 일반 FSK 용도로만 쓸 경우에는 CC1310 을 쓰는 것이 낫고. 

로라를 쓸 경우에는 로라 모뎀을 써야하는데 말입니다. ^^

[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년 10월 10일 월요일

[터치 키 IC] CY8CMBR31xx 소개(PSOC5 소스 포함)

안녕하세요. 계획에 없던 IC 소개 글을 쓰게 됐네요.

편집을 하다 보니 글이 꽤 깁니다. 값싸고 성능이 좋은 IC 라고 생각 되며, PSOC5 와 같이 테스트를 했습니다.
STM32 계열이나 다른 CPU와도 연결해서 써도 괜찮겠는데, 나중에 STM에 연결하게 되면 또 올리겠습니다.

편집하다 보니 시간이 너무 많이 들어가서 그림 위주로 올리겠습니다.

[참고한 자료 #1] - 링크

[참고한 자료 #2] - 링크






















이렇게 추가를 하면, host API 폴더에 있는 MBR31xx IC를 콘트롤 할 수 있는 함수들을 사용할 수 있는데, I2C 콤포넌트 이름이 틀리다고 에러가 날 것 입니다.

이 API 함수가 PSOC4와 연동해서  동작하도록 되어 있는데, PSOC5 와 이름만 틀리고 완전히 동일하게 쓰이니까, I2C 함수 이름만 맞게 바꿔 주면 에러가 없어집니다.

컴파일해서 프로그램을 넣으면, 동작이 안되네요.

디버그로 추적해서 보니까, 원인은 예제 프로젝트가 MBR3116 IC 로 되어있고,
제가 사용한 IC는 MBR3108 이어서 ID 비교 시에 오류가 나서 동작이 안됐습니다.

Host_API 폴더안의 CY8CMBR3xxx_Device.h 파일에서 다음과 같이 디바이스 이름을 수정해 주면 정상 동작합니다.


제가 첨부한 PSOC5 프로그램은 예제와는 약간 다릅니다.
인터럽트 방식을 사용하지 않았고, Proximity 센싱 대신에 버튼을 3개 센싱하는 프로그램 입니다.

LED 3개를 host에서 I2C로 제어 합니다. 

아쉬운 것이, Proximity Sense 와 Guard Sense 를 테스트 못해봤는데..
PSOC 과는 다르게 버튼을 공통으로 Proximity Sense 와 사용할 수 없었던 점을 미리 알지 못했네요. 
Proximity Sense 와 Guard Sense 는 핀이 정해져 있는 것이 좀 다르네요.

또 한가지 아쉬운 점은, 16원짜리 PWM회로 없는 부저를 1개 달았으면 터치키가 눌릴 때 마다 소리가 나서 눌렸다는 정보를 전달해 줄 수 있었는데, 뭐 하는 기능인지 최초 설계시에 잘 몰랐습니다. ㅜㅜ


이 칩을 사용하기 전에 PSOC5 나 PSOC4 에서 CAPSENSE 기능을 사용해 봤었는데,
PSOC에서 CAPSENSE 기능을 사용시에는 너무 반응속도가 늦었습니다. 버튼이 많아질 수록 반응 속도가 더 늦어 져서 거의 사용하기 싫을 정도(?) 였었는데.. 이유는 CAPSENSE 읽는 함수를 여러 번 실행해야 응답이 1번 오는데, 버튼이 더 많아질 수록 더 많이 CAPSENSE 읽는 함수를 실행해야 해서 그렇게 느려졌습니다.

제가 혹시 잘 못 사용하는 것은 아닌지, PSOC에서 CAPSENSE 읽는 속도를 개선하는 방법을 알고 계시는 분이 계시면 좀 알려 주십시요.

결론은, 이 칩(MBR31xxx)를 사용하면 그냥 I2C로 일반 택트 스위치 읽듯이 주기적으로 값을 읽으면 됩니다. 그리고 읽은 정보를 보고 LED 상태를 바꾸고 싶으면 I2C로 LED 상태 변경 명령을 보내면 됩니다. 속도도 전혀 느려지지 않습니다.

정말로, 앞으로 터치 센서를 사용할 경우에는 이 칩만 쓰고 싶습니다. ^^

아~~, 또 한가지 .. PSOC4,5 에서 CAPSENSE 를 연결할 경우 PSOC과 CAPSENSE PCB PAD 와는 거리가 짧아야 하고 센싱 입력 ADC 선을 메쉬 쉴드와 쿠퍼로 감싸줘야 합니다.
그래서 CPU 와 터치 센서와의 위치에 대해서 엄청난 고민을 해서 아트웍과 위치 선정에 어려움이 많았고, 거리도 멀게 배치할 수도 없었는데 이 칩(MBR31xx)가 모든 고민을 해결해 줬습니다.

거리가 멀어도 됩니다. I2C 통신 거리가 보통 1m 정도는 나오니까, PCB 어디에도 터치를 연결할 수 있겠습니다.

또 한가지 장점이 있네요. PSOC에서 CAPSENSE를 사용하려면 IDAC 가 1개 들어갑니다. 만약에 DAC를 사용해야 할 때, CAPSENSE 때문에 DAC가 부족하면 PSOC 중에서 DAC가 1개 더 많은 종류를 선택해야 하는데, 이 경우에 MBR31xx 보다 가격이 더 올라갑니다.
이런 경우 당해 보셨나요? 저는 당해 봤습니다. ^^

아.. 이번에도 참 좋은 IC를 알게 되고 사용해 봤습니다. 앞으로도 많이 사용하게 될 것 같습니다. 이 칩 간만에 본 명품입니다. ^^

가격은, 단돈 $0.76 @ 1k.







[테스트 동영상]