This program generates sound by using FM tone generator YMF825 via SPI.

Dependencies:   microbit

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fmsd1_micro.cpp Source File

fmsd1_micro.cpp

00001 #include "MicroBit.h"
00002 
00003 SPI ymf825(MOSI, MISO, SCK);
00004 MicroBitPin ss(MICROBIT_ID_IO_P16,MICROBIT_PIN_P16,PIN_CAPABILITY_DIGITAL);
00005 MicroBitPin rst(MICROBIT_ID_IO_P8,MICROBIT_PIN_P8,PIN_CAPABILITY_DIGITAL);
00006 
00007 //extern MicroBit uBit;
00008 //#define   ss    uBit.io.P16
00009 //#define   rst   uBit.io.P8
00010 
00011 void writeSingleCPP( unsigned char adrs, unsigned char data )
00012 {
00013     ss.setDigitalValue(0);  //  select slave
00014     ymf825.write(adrs);
00015     ymf825.write(data);
00016     ss.setDigitalValue(1);
00017     wait_ms(1);
00018 }
00019 extern "C" void writeSingle( unsigned char adrs, unsigned char data ){ writeSingleCPP(adrs,data);}
00020 extern "C" void writeBurst( unsigned char adrs, unsigned char* data, int count )
00021 {
00022     ss.setDigitalValue(0);
00023     ymf825.write(adrs);
00024     for (int i = 0; i<count; i++) {
00025         ymf825.write(*(data + i));
00026     }
00027     ss.setDigitalValue(1);
00028     wait_ms(1);
00029 }
00030 extern "C" void delayMs( int ms ){ wait_ms(ms);}
00031 
00032 void initSPI(void)
00033 {
00034     //  init SPI
00035     ymf825.format(8);   //  mode=0
00036     ymf825.frequency(4000000);
00037 
00038 }
00039 void initSD1( void )
00040 {
00041     //  1.  powerOnReset( void );
00042     rst.setDigitalValue(0);
00043 
00044     //  2. wait 100usec
00045     wait_us(100);
00046 
00047     //  3.  RST_N : high
00048     rst.setDigitalValue(1);
00049 
00050     //  4.  DRV_SEL : low
00051     writeSingleCPP(29, 1);  //  3.3v
00052 
00053     //  5.  AP0 : 0
00054     writeSingleCPP(2, 0x0e);
00055 
00056     //  6.  wait for Quarz stability
00057     wait_ms(1);
00058 
00059     //  7.  CLKE : "1"
00060     writeSingleCPP(0, 0x01);
00061 
00062     //  8.  ALRST : low
00063     writeSingleCPP(1, 0x00);
00064 
00065     //  9.  SFTRST  :   0xa3
00066     writeSingleCPP(26, 0xa3);
00067     wait_ms(1);
00068 
00069     //  10. SFTRST  :   0x00
00070     writeSingleCPP(26, 0x00);
00071 
00072     //  11. wait 30msec
00073     wait_ms(30);
00074 
00075     //  12. AP1 AP3: "0"
00076     writeSingleCPP(2, 0x04);
00077 
00078     //  13. wait 10usec
00079     wait_us(10);
00080 
00081     //  14. AP2: "0"
00082     writeSingleCPP(2, 0x00);
00083 
00084     writeSingleCPP(25, 0xcc);   //  -32[dB]
00085     writeSingleCPP(27, 0x3f);   //  set itp max
00086     writeSingleCPP(20, 0x00);   //  set itp on
00087     writeSingleCPP(3, 0x01);    //  amp gain(6.5[dB])
00088     writeSingleCPP(9, 0xf8);    //  Sequencer Volume
00089 }