2013年9月15日 星期日

CSR Blue Flash Tools 產生燒錄檔(.xdv和.xpv)

當程式開發完成後,使用Debug->Run在平台上驗證沒有問題後就可以產生燒錄檔,產生檔案前要確認USB-SPI下載線與開發平台是連線的.
1. 開啟"BlueFlash"工具.
2. 使用滑鼠按下"Start Processor",在按"Dump".
3. 可以修改存檔名稱,如無修改就按下"存檔".
4.  之後開始從開發平台上Dump出燒錄檔.
5. 最後產生出xxx.xdv和xxx.xpv燒錄檔.


2013年9月13日 星期五

CSR Bluetooth 記事

請不要問我,我也在學習中.......

CSR Bluetooth 四種基本類型的位址:
(1). BD_ADDR: 藍芽設備位址.
(2). AM_ADDR:活動成員位址(Active Member) .
(3). PM_ADDR:休眠成員位址.
(4). AR_ADDR:詢問請求位址.

2013年9月9日 星期一

CSR Headset Configuration Tool-使用自訂語音提示聲音

CSR有內建語音提示聲音,當內建的提示聲音無法滿足開發者的需求時,可以自訂語音提示聲音.
CSR xIDE使用自訂語音提示聲音需要做.wav檔換成ADPCM(Adaptive DPCM).
建議轉檔的原始聲音檔為.wav, sampling rate44.1KHz.

1. 開啟Headset Configuration Tool.

2. 選擇〝Voice Prompts〞標籤欄.
(a). Voice Prompts Configuration: FileSystem.
(b). Prompts File Format: ADPCM
(c). Sample Rate(Hz): 44100
(d). 如果一次要轉換多個.wav,請點選Number of events per language= 捲軸,目前這個範例我只選擇轉一個.wav.
(e). 點選欄位增加需轉換的.wav.
(f). 最後,設定完成按下〝Create Voice Prompts〞按鍵.

將〝Do Not Play when SCO is presentv取消.
3. 按下〝確定〞開始轉檔.
4. 存檔位置選擇Projectimage路徑下,存檔的檔案名稱為0.prm,如果一次有多個檔案需要轉檔,程式會自動排列為0.prm 1.prm 2.prm…,確認完後按〝存檔〞.

5. 最後解果可以看到在Projectimage/prompts產生0.prm.

還有在image/headers路徑下,CSR程式需要讀取的0.idx設定檔.

2013年9月7日 星期六

CSR xIDE makefile的warnings參數

CSR xIDE是使用GCC編譯器,第一次使用CSR xIDE 撰寫程式時,會發現與我們所使用的其他IDE有些許不同,像是不可以使用" // "做註解,不可以在函數前直接宣告變數型態.
只要將 makefile的warnings參數取消就可以使用.
-ansi 禁止雙斜線(//)註解.

-pedantic 禁止函數在前變數型態宣告.

1. 開啟IDE下(xIDE 版本)/tools/Makefile.rules檔.
 2. 刪除"-pedantic"就可以函數前變數型態宣告,刪除"-ansi "就可以使用雙斜線(//)做註解,不過CSR xIDE不會將雙斜線(//)做註解的文子改變顏色,沒有顏色的區別,看code真的很累,看來還是乖乖使用"/* */"作註解.

CSR xIDE 前置處理器-條件式編譯設定

CSR xIDE 下提供了一些sample code, sample code的架構使用了很多 前置處理器的條件式編譯,CSR xIDE 提供了設定工具,取代了在程式中加入#define的前置處理器條件式編譯方式.

1. 選擇"Project"->Properties...
2. 使用滑鼠點選"Build System",之後再選擇"Define symbols"欄位,之後就可以設定在程式中需要編譯的部分,在參數中有小"x"代表不編譯.
3. Define symbols的參數,請參考xIDE安裝完成後的文件.
文件"ADK 2 Headset Application User Guide",的章節"3. To Set Up the xIDE Project Environment"和
"ADK 2 Audio Adaptor User Guide",的章節"3. To Set Up the xIDE Project Environment"中有說明.

2013年9月6日 星期五

C前置處理器-條件式編譯


#include <stdio.h>

int main()
{

#define A 1
#define C 1
#define E 1

#if A //true
    printf("HelloWorle-1\n");
#endif

#if B //false
    printf("HelloWorle-2\n");
#endif

#if defined(C) //true
    printf("HelloWorle-3\n");
#endif

#if defined(D) //false
    printf("HelloWorle-4\n");
#endif

#if !defined(E) //true
    printf("HelloWorle-5\n");
#endif

#if !defined(F) //false
    printf("HelloWorle-6\n");
#endif

    return 0;

}

結果:


#if  #if defined(x)  #if !defined(x) 結尾都要加上#endif,由上述的程式範例可以看到反白處都是編譯器不會被編譯到的程式碼.
當#if  #if defined(x)  #if !defined(x)的判斷式沒有被#define宣告,就為"0",反之當被#define宣告為為"1"時,編譯器就會被編譯到判斷式內的程式碼.

2013年9月4日 星期三

2013年9月2日 星期一

CSR USB-SPI Cable

以前CSR Cable是使用PC的print port,現在有USB-SPI的cable.
1. 要按Debug的Run前,要先設定"Transport".
2. 之後勾選"USB SPI (231056)" ,按"OK",這樣在按Debug的Run才不會出現找不到SPI的情形.


撰寫一個程式使用批次檔自動執行

之前在一家觸控IC的設計公司上班時,寫了一的簡單的程式,用來重新排列IC測試機台所提供資料.

IC測試機台會提供數十個到至數百個.txt文字檔,每個文字檔的內容類似如下所示:

t001_log.txt
*********************************
0x00000000
0x00000001
0x00000002
0x00000003
0x00000000
0x00000001
0x00000002
0x00000003
0x00000000
0x00000001
.......以下還有
*********************************
由上述的範例來說,每筆資料是用16進位表示法的32bit的data,我只要取出每筆資料最後兩個bit的值,之後每10筆資料,在組成一筆data.
之後還要每個.txt檔案須取出第41~1320筆有效資料,第1至40筆資料與已忽略,超過1320筆資料也忽略掉.

1. main.c(主程式,編譯完成的執行檔為adc.exe )
*********************************
#include <stdio.h>
#include <stdlib.h>

char hex2ascii(char Number2)
{
 char outtxt;
 switch(Number2)
 {
 case 0x0:
  outtxt = '0';
  break;
 case 0x1:
  outtxt = '1';
  break;
 case 0x2:
  outtxt = '2';
  break;
 case 0x3:
  outtxt = '3';
  break;
 case 0x4:
  outtxt = '4';
  break;
 case 0x5:
  outtxt = '5';
  break;
 case 0x6:
  outtxt = '6';
  break;
 case 0x7:
  outtxt = '7';
  break;
 case 0x8:
  outtxt = '8';
  break;
 case 0x9:
  outtxt = '9';
  break;
 case 0xA:
  outtxt = 'A';
  break;
 case 0xB:
  outtxt = 'B';
  break;
 case 0xC:
  outtxt = 'C';
  break;
 case 0xD:
  outtxt = 'D';
  break;
 case 0xE:
  outtxt = 'E';
  break;
 case 0xF:
  outtxt = 'F';
  break;
 default:
  printf("?");
  break;
 }
 return outtxt;
}

char ascii2hex(char Number1)
{
 char chbit;
 switch(Number1)
 {
 case '0':
  chbit = 0x0;
  break;
 case '1':
  chbit = 0x1;
  break;
 case '2':
  chbit = 0x2;
  break;
 case '3':
  chbit = 0x3;
  break;
 case '4':
  chbit = 0x4;
  break;
 case '5':
  chbit = 0x5;
  break;
 case '6':
  chbit = 0x6;
  break;
 case '7':
  chbit = 0x7;
  break;
 case '8':
  chbit = 0x8;
  break;
 case '9':
  chbit = 0x9;
  break;
 case 'A':
  chbit = 0xA;
  break;
 case 'B':
  chbit = 0xB;
  break;
 case 'C':
  chbit = 0xC;
  break;
 case 'D':
  chbit = 0xD;
  break;
 case 'E':
  chbit = 0xE;
  break;
 case 'F':
  chbit = 0xF;
  break;
 case 'a':
  chbit = 0xA;
  break;
 case 'b':
  chbit = 0xB;
  break;
 case 'c':
  chbit = 0xC;
  break;
 case 'd':
  chbit = 0xD;
  break;
 case 'e':
  chbit = 0xE;
  break;
 case 'f':
  chbit = 0xF;
  break;
 default:
  printf("?");
  break;
 }
 return chbit;
}

int main(void)
{
 FILE *fs,*fd;
 char sfilename[20],dfilename[20];
 char data;
 char word8[8];
 char conversion[10][2]; //ADC0 ADC1
 unsigned short outword = 0;
 int adc0=0,adc1=0;

 char outputtxt = 0;
 char checkbit = 0;

 char buffer1[5] = {0,0,0,0,0};
 char buffer2[5] = {0,0,0,0,0};

 int filepointer;
 int sdatacount = 0;

 printf("Output source file name:");
 scanf("%s",dfilename);
 if((fd=fopen(dfilename,"w"))==NULL)
 {
  printf("\nObject file unable to open!");
  system("PAUSE");
  return 0;
 }
 
 while(1)
 {
  printf("\nInput source file name:");
  scanf("%s",sfilename);

  if((fs=fopen(sfilename,"r"))==NULL)
  {
   printf("\nSource file unable to open!");
   fclose(fd);
   system("PAUSE");
   return 0;
  }

  while((data=fgetc(fs))!=EOF) //read source file
  {
   int x=0x78;
   if(x != (x & data))
   {
    printf("%c",data);
   }
   else
   {
    printf("%c",data); //'x'
    *(word8+0) = fgetc(fs); 
    printf("%c",*(word8+0));
    *(word8+1) = fgetc(fs); 
    printf("%c",*(word8+1));
    *(word8+2) = fgetc(fs); 
    printf("%c",*(word8+2));
    *(word8+3) = fgetc(fs); 
    printf("%c",*(word8+3));
    *(word8+4) = fgetc(fs); 
    printf("%c",*(word8+4));
    *(word8+5) = fgetc(fs); 
    printf("%c",*(word8+5));
    *(word8+6) = fgetc(fs); 
    printf("%c",*(word8+6));
    *(word8+7) = fgetc(fs);
    printf("%c",*(word8+7));

    checkbit = ascii2hex(*(word8+7));

    if(adc0<10) //to array
    {
     *(*(conversion+adc0)+(adc1+0)) = checkbit & 0x1; //bit_0
     checkbit >>= 1;
     *(*(conversion+adc0)+(adc1+1)) = checkbit & 0x1; //bit_1
     adc1 = 0;
     adc0++;
    }
    sdatacount++;
   }
   if(adc0==10) //move array data
   {
    adc0 = 0;
    if((sdatacount > 40) && (sdatacount < 1321)) //taken out the data(1280)
    {
     //to object DEC file
     outword = *(*(conversion+0)+1) & 0x1; //ADC1
     outword <<= 1;
     outword = outword | (*(*(conversion+1)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+2)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+3)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+4)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+5)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+6)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+7)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+8)+1) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+9)+1) & 0x1);
     itoa(outword,buffer1,10); //numerical value to character string
     fseek(fd,filepointer,SEEK_SET); //shift file pointer
     fputc(*(buffer1+0),fd); //word to new file
     fputc(*(buffer1+1),fd);
     fputc(*(buffer1+2),fd);
     fputc(*(buffer1+3),fd);
     fputc(0x09,fd); //Tab

     outword = *(*(conversion+0)+0) & 0x1; //ADC0
     outword <<= 1;
     outword = outword | (*(*(conversion+1)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+2)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+3)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+4)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+5)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+6)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+7)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+8)+0) & 0x1);
     outword <<= 1;
     outword = outword | (*(*(conversion+9)+0) & 0x1);
     itoa(outword,buffer2,10); //numerical value to character string
     fputc(*(buffer2+0),fd); //word to new file
     fputc(*(buffer2+1),fd);
     fputc(*(buffer2+2),fd);
     fputc(*(buffer2+3),fd);
     fputc(0x0A,fd); //line feed
     *(buffer1+0) = 0; //clean buffer
     *(buffer1+1) = 0;
     *(buffer1+2) = 0;
     *(buffer1+3) = 0;
     *(buffer2+0) = 0;
     *(buffer2+1) = 0;
     *(buffer2+2) = 0;
     *(buffer2+3) = 0;
    }
   }
   filepointer = ftell(fd); //read file pointer
  }
  filepointer = ftell(fd); //read file pointer
  fclose(fs);
  sdatacount = 0;
 }
 fclose(fd);
 printf("\nCopy OK!");
 system("PAUSE");
 return 0;

}
*********************************


2. commamd.txt(給批次檔執行的指令)
*********************************
out.txt
t001_log.txt
t002_log.txt
t003_log.txt
t004_log.txt
t005_log.txt
t006_log.txt
t007_log.txt
t008_log.txt
t009_log.txt
t010_log.txt
t011_log.txt
t012_log.txt
pause
*********************************


3. adc.bat(批次檔)
*********************************
@echo off
adc.exe < command.txt
pause
*********************************

最後只要使用滑鼠點選"adc.bat"檔,批次檔就會依照"commamd.txt"的順序將需要轉換的t00*_log.txt文字檔依序讓adc.exe執行,最後轉換的結果存檔成out.txt.