페이지

글목록

2015년 12월 19일 토요일

[DA14580] OTP 메모리 쓰기.

안녕하세요,

이번엔, Dialog 사의 BLE 통신 칩인 DA-14580의 OTP 메모리 쓰는 방법을 포스팅 합니다.

그냥 0.9V~3.6V 의 전원 전압만 있어서는 안되는데, 
이 점을 간과하고 넘어가서, 회로를 한번 바꿔야 할 것 같습니다.

만약 이 칩을 사용하시려 한다면 처음부터 6.8V 를 VPP에 인가할 수 있도록
H/W를 설계하시기 바랍니다.

메뉴얼을 읽어보면, 다음과 같은 내용이 있습니다.
Please note, 6.8V can only be applied to VPP after VBAT3V is supplied and 6.8v must be
removed from VPP before the supply to VBAT3V is removed. Otherwise the chip could be
damaged.The 6.8V supply must be applied without ringing. The overshoot could also cause
damage.

VBAT3V에 전원을 인가한 후에 VPP에 6.8V를 인가하고,
VBAT3V에 전원을 제거한 후에, VPP에서 6.8V를 제거하라.
6.8V 는 리플이 없게 하라.
위의 순서를 지키지 않거나, VPP에 오버슛이 있을 시 칩에 손상이 있을 수 있다..
이런 내용입니다.



먼저 VPP 핀에 입력할 6.8V 를 만들어야 하므로, 개발 키트에서 일단 Copy해서 온 회로도는 다음과 같습니다.
PC의 USB 5V에서 6.8V 를 만드는 회로 입니다.

다음은 특정 IO를 지정해서 위에서 언급한 VBAT 과 VPP 를 인가하는 타이밍을 smartsnippets 프로그램에서
자동으로 ON/OFF 하도록 하는데 필요한 VPP 전원 ON/OFF control 회로도입니다.
이것도 개발 킷트 에서 공개된 회로도 입니다.


윈도우 개발 환경 프로그램인 Smartsnippets 에서 VPP를 On/Off 시키는 I/O 를 지정할 수 있게 되어 있습니다.


OTP 프로그램을 하려고 여러가지 알아보다 보니, 현재 smartsnippets 프로그램의 오류가 하나 있었습니다.
버전 3.8에서 NVDS OTP Write 기능에서 BD ADRESS 항목이 수정이 안되는 점인데, Dialog 사의 지원팀에 문의해서
답변으로 "이상이 있으니 본사에 조치를 취하도록 요청을 한다"고 하네요.

저는 안써저서 HEX 파일을 수정해서 다시 읽어서 현재 쓰고 있습니다. ^^


오늘(2015-07-10, 오후 2:20) 테스트한 내용.
1. VBAT3V 에 리튬 밧데리(3V)를 연결하고 점퍼로 VBAT3V 를 ON/OFF 할 수 있도록 했다.
2. VPP 와 GND에 선을 연결해서 디지탈 가변 파워 서플라이에 연결했다.
3. 위의 내용 처럼 IO에 의해 자동으로 제어하지는 않고, VBAT3V 를 ON 하고 VPP에 6.8V 를 순서대로 ON
4. NVDS OTP Write 시 Warning 이 뜹니다. 그냥 진행 했음.
5. 쓰기 성공 & 전원 껐다 키고 읽어 보니 내용이 남아 있음.
6. APP program 은 SPI 에 넣고 NVDS 데이터는 OTP에서 읽어서 사용하려고 했는데, 엉뚱한 값이 나옵니다.
   이것은 또 다이얼로그 지원팀에 물어봐야겠습니다. 에구 속터지네요. 

[1,2] H/W 세팅

[4] 워닝 내용 (에러는 어제 내용 인데 굽고 나서 캡쳐를 못해서 어제 이미지를 사용)

[5] 쓰고 나서 읽어본 내용 (Smartsnippes 프로그램을 사용) : 잘 들어가 있습니다.

[6] 비콘 데이터 수신 내용. NVDS에 쓴 내용이 안나옴.




Dialog korea 기술 지원 팀에서 답변을 받아서 문제를 해결한 내용을 올려 봅니다.

In nvds.c

voidnvds_read_bdaddr_from_otp()

{
#ifdefBDADDR_FROM_OTP
#ifndef APP_BOOT_FROM_OTP   
    intcnt = 100000;
#defineXPMC_MODE_MREAD   0x1
   uint8_t *otp_bdaddr = (uint8_t *)0x40000 + BDADDR_FROM_OTP;   //wherein OTP header is BDADDR
   
    SetBits16(CLK_AMBA_REG,OTP_ENABLE,1);                // enable OTP clock        
   while ((GetWord16(ANA_STATUS_REG) & LDO_OTP_OK) != LDO_OTP_OK &&cnt--)
       /* Just wait */;
       
    //set OTP in read mode
    SetWord32(OTPC_MODE_REG,XPMC_MODE_MREAD);
# else
   uint8_t *otp_bdaddr = (uint8_t *)0x20000000 + BDADDR_FROM_OTP;  //where in OTP header is BDADDR
# endif//APP_BOOT_FROM_OTP

#ifdefREAD_NVDS_STRUCT_FROM_OTP
   memcpy(nvds_data_ptr, (uint8_t *)0x40000, sizeof(struct nvds_data_struct));
#endif //READ_NVDS_STRUCT_FROM_OTP

   memcpy(&dev_bdaddr, otp_bdaddr, sizeof(dev_bdaddr));
   SetBits16(CLK_AMBA_REG, OTP_ENABLE, 0);     //disable OTPclock    
# ifdefSUPPORT_1_8_V
       SetBits16(DCDC_CTRL2_REG, DCDC_VBAT3V_LEV, 0x0);   //Support 1.8Vboot
# endif//SUPPORT_1_8_V
#endif//BDADDR_FROM_OTP
}

위의 붉은 글씨로 된 부분을 소스코드에 추가했더니, NVDS OTP에 쓴 데이터가 휴대폰 APP에서
나타났습니다.


Smartsnippets 프로그램에서 보드 어드레스 수정하는 부분은 어떻게 되고 있는지 ,  현재 답변을
기다리는 중입니다.

댓글 없음:

댓글 쓰기