2017年9月23日土曜日

FM・AMラジオモジュールのSi4730を動作させてみた 

おひさしぶりです。 ねじねじだよ。

~はじめに~
aitendoの"Si4730-M"を使用して、si4730を動かしてみました。
si4730とは、Silicon Labs社のラジオICです。

~苦労したこと~
"Si4730-M"の足はんだ付けのPIN距離が独自?であるので、
  ブレットボードに組み付けつ際、はんだ付けがめんどくさい。
・I2Cのアドレスがわからなかったこと。 
 →aitendoに添付しているデータシートに記載がない?。
・動作シーケンスを理解するに、データシートを2日読んでいた。

~これから~
・read Statusのチェック処理などをインプリする。
・ハードウェアより周波数を変更できるようにする。
・SNRやRSSIをモニターできるようにする。
・AMラジオが聞けるようにする。

~参考サイト~
シリコンラボのSi4730 のサイト
・si4730 pdf ハードウェアのデータシート
・AN332 pdf   Si47xx Programming Guide 

~作業中の写真




~回路図~
RESETとI2Cの2本、電源3.3VとGNDをmbedから配線している。
I2Cには、プルアップ抵抗を入れている。


~美味しいソース
ソースでわかると思うけど、I2Cマスターはmbed です。
とりあえず、動作する(音がなる)プログラムです。周波数変更は、ソース変更が必要です。
無駄があったりやコメントがおかしいことろがあるかと思いますが、ねじねじだよ。
=======================================
#include "mbed.h"

DigitalOut myled(LED1);

DigitalOut RST_L(p20);
I2C si4730_i2c(p9, p10);
const int addr = 0xc6; // define the I2C Address 0xc6
Serial pc(USBTX, USBRX); // tx, rx

int main() {
    pc.printf("\n\nstart\n");
    
    //RESET
    RST_L = 1;
    wait_ms(200);
    RST_L = 0;
    wait_ms(1);
    RST_L = 1;


    char cmd[6];
    char buff[16];

    //Powerup in Analog Mode
    pc.printf("\npowerup in Analog Mode\n");

    cmd[0] = 0x01;
    cmd[1] = 0x10;//1xxx1xxxx
    cmd[2] = 0x05;//00000101 = Analog audio outputs (LOUT/ROUT).
    si4730_i2c.write(addr, cmd , 3);
    wait_ms(100);//wait
    si4730_i2c.read(addr, buff, 16);    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    

    //GET_REV
    pc.printf("GENT_REV\n");
    cmd[0] = 0x10;
    si4730_i2c.write(addr, cmd , 1);
    si4730_i2c.read(addr, buff, 16); 
    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
     
         
    //FM_TUNE_FREQ
    pc.printf("FM_TUNE_FREQ\n");
    cmd[0] = 0x20;
    cmd[1] = 0x00;
    cmd[2] = 0x1E;//79.3MHz 0x1EFA 
    cmd[3] = 0x50;
    cmd[4] = 0x00;
    si4730_i2c.write(addr, cmd , 5);
    si4730_i2c.read(addr, buff, 16); 
    wait(1);//wait???
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    
    //read 確認
    si4730_i2c.read(addr, buff, 16); 
    wait(5);//wait???
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    
    
    
    
    //GET_INT_STATUS
    pc.printf("GET_INT_STATUS\n");
    cmd[0] = 0x14;
    si4730_i2c.write(addr, cmd , 1);
    si4730_i2c.read(addr, buff, 16); 
    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    
    
    
    //FM_TUNE_STATUS
    pc.printf("FM_TUNE_STATUS\n");
    cmd[0] = 0x22;
    cmd[1] = 0x01;
    si4730_i2c.write(addr, cmd , 1);
    si4730_i2c.read(addr, buff, 16); 
    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    
      
    
    //SET_PROPERTY RX_VOLUME
    pc.printf("SET_PROPERTY RX_VOLUME\n");
    cmd[0] = 0x12;
    cmd[1] = 0x00;
    cmd[2] = 0x40;
    cmd[3] = 0x00;
    cmd[4] = 0x00;
    cmd[5] = 0x30;//MAX:0x3F-MIN:0x00
    si4730_i2c.write(addr, cmd , 6);
    si4730_i2c.read(addr, buff, 16); 
    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");
    
    
    
     /*
    //SET_PROPERTY FM_DEEMPHASIS
    pc.printf("SET_PROPERTY FM_DEEMPHASIS\n");
    cmd[0] = 0x12;
    cmd[1] = 0x00;
    cmd[2] = 0x11;
    cmd[3] = 0x00;
    cmd[4] = 0x01;
    si4730_i2c.write(addr, cmd , 5);
    si4730_i2c.read(addr, buff, 16); 
    
    pc.printf("ST  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10 R11 R12 R13 R14 R15 \n");
    for(int i=0; i<=15 ;i++){     
    pc.printf("%02x  ",buff[i]);
    }
    pc.printf("\n\n");

*/
    
    pc.printf("END\n\n");
    
}

1 件のコメント:

  1. The 10 Best Casinos Near Harrah's Cherokee Casino & Hotel
    Casinos Near Harrah's Cherokee Casino 서산 출장안마 & Hotel · 화성 출장샵 Casino Hotel in Cherokee, NC · Harrah's Cherokee Casino 부천 출장안마 Resort · Cherokee 통영 출장마사지 Harrah's Cherokee Casino Resort 김해 출장안마 · Casinos Near

    返信削除