AM FM Radio Receiver

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
peimmaj
Date:
Thu Mar 07 18:37:37 2013 +0000
Commit message:
Final version.

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Mar 07 18:37:37 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Mar 07 18:37:37 2013 +0000
@@ -0,0 +1,114 @@
+// My AM/FM Radio, Lab 3 Main
+// Jammie Proctor
+// 03/02/2013
+
+#include "mbed.h"
+#include "TextLCD.h"
+
+I2C radio(p28, p27);                        // sda, scl
+TextLCD lcd(p15, p16, p17, p18, p19, p20);  // rs, e, d4-d7
+DigitalIn AM_FM(p22);                       // Radio mode AM/FM
+DigitalIn station(p23);                     // Station seek/scan
+DigitalOut reset(p21);                      // Radio reset
+DigitalOut lock(LED1);                      // Station active
+PwmOut rclock(p24);                         // Rclock generation
+
+//====================================== Global Variables =============================================
+const int write_addr=0x22;                          
+int fm_pwr_up[3]={0x01, 0x00, 0x05};                    // FM power-up command
+int am_pwr_up[3]={0x01, 0x01, 0x05};                    // AM power-up command
+int fm_station[4]={0x20, 0x00, 0x22, 0x60};             // Set FM station
+int am_station[6]={0x40, 0x00, 0x02, 0x17, 0x00, 0x00}; // Set AM station
+float lcd_station=88.0;
+int reg_station=8800, reg_am_station=535, i=0, Response, ack=0, pwr_down=0x11, tune=0x31;
+int* p_pwr_down = &pwr_down;
+int* p_tune = &tune;
+bool last_mode=0;
+
+//===================================== Support Functions =============================================
+void SendCommand(int* array, int length) {  /* Send Command to Si4735 */
+    radio.start();
+    ack=radio.write(write_addr);
+    for(i=0; i<length; i++) ack=radio.write(array[i]);
+    Response=radio.read(ack);
+    radio.stop();
+    wait(.2);
+}
+    
+void Reset(void) {                          /* Reset AM/FM Radio */
+    reset=0;
+    wait(.2);
+    reset=1;
+    wait(.2);
+}
+
+void AM_Restart(void) {                     /* Reinitialize AM receiver */                 
+    SendCommand(p_tune, 1);                         // Disable carrier
+    wait(.2);
+    SendCommand(p_pwr_down, 1);                     // Power down sequence
+    wait(.2); 
+    Reset();
+    SendCommand(am_pwr_up, 3);                      // Launch AM 
+    SendCommand(am_station, 6);                     // Play current AM station
+}
+
+void FM_Restart(void) {                     /* Reinitialize FM receiver */                          
+    SendCommand(p_tune, 1);                         // Disable carrier
+    wait(.2);
+    SendCommand(p_pwr_down, 1);                     // Power down sequence
+    wait(.2); 
+    Reset();
+    SendCommand(fm_pwr_up, 3);                      // Launch FM
+    SendCommand(fm_station, 4);                     // Play current FM station
+}
+//================================================ Main Code =======================================================
+int main() {
+    AM_FM.mode(PullUp);
+    station.mode(PullUp);
+    lock=0;
+    rclock.period(.000030518);                  // Set rclock oscillator to 32.768kHz
+    rclock=0.5;                                 // 50% Duty Cycle for rclock
+    radio.frequency(100000);                    // I^2C frequency setting 100kHz
+    Reset();                                   
+    SendCommand(fm_pwr_up, 3);                  // Initialize FM
+    SendCommand(fm_station, 4);                 // Play default fm station
+    last_mode=AM_FM;
+        
+    while(1) {
+        if(AM_FM) {                                 // FM selected (SW1 in the off position)
+            if(AM_FM!=last_mode) FM_Restart();      
+            last_mode=AM_FM;
+            if(!station) {                          // SW2 pressed? Go to next station
+                lock=0;
+                while(!station);
+                if(reg_station<10800) reg_station+=10;
+                else reg_station=8800;
+                lcd_station=reg_station/100.0;
+                fm_station[3]=reg_station&0x00FF;
+                fm_station[2]=reg_station>>8;
+                SendCommand(fm_station, 4);          
+                lock=1;       
+            }
+            lcd.printf("Station:\n %3.1fMHz FM", lcd_station);
+            wait(.1);
+            lcd.cls();
+        }
+        else {                                              // AM selected (SW1 in the on position)
+            if(AM_FM!=last_mode) AM_Restart();
+            last_mode=AM_FM;
+            if(!station) {                                  // SW2 pressed? Go to next station
+                lock=0;
+                while(!station);
+                if(reg_am_station<1700) reg_am_station+=5;
+                else reg_am_station=530;
+                am_station[3]=reg_am_station&0x00FF;
+                am_station[2]=reg_am_station>>8;
+                SendCommand(am_station, 6);                 
+                lock=1;       
+            }
+            lcd.printf("Station:\n %ukHz AM", reg_am_station);
+            wait(.1);
+            lcd.cls();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Mar 07 18:37:37 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/3d0ef94e36ec
\ No newline at end of file