This program generates sound by using FM tone generator YMF825 via SPI.
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 08:46:10 by 1.7.2