Advertisement
miszczo

Si4703.c

Apr 21st, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.62 KB | None | 0 0
  1. /*
  2.  * si4703.c
  3.  *
  4.  *  Created on: 13-04-2013
  5.  *              14:11:02
  6.  *      Author: miszczo
  7. */
  8.  
  9. #include <avr/io.h>
  10. #include <util/delay.h>
  11. #include "si4703.h"
  12. #include "I2C/i2c_soft.h"
  13.  
  14.  
  15. void si_read_reg(uint16_t *mybuf)
  16. {
  17.     uint8_t a;  // zmienne pomocnicze
  18.     uint8_t b;  //
  19.  
  20.     I2C_START();
  21.     i2cPutbyte(0x21); // adres si read
  22.  
  23. //  _delay_ms(700);   //TEGO TO BY MOGLO NIE BYC HEHE
  24.     for(b=0x0A;;)
  25.     {
  26.         if(b == 0x10) b = 0x00;
  27.         a = i2cGetbyte(1);
  28.         mybuf[b] = (a<<8);
  29.         a = i2cGetbyte(1);
  30.         mybuf[b] |= a;
  31.         if(b == 0x09) return;
  32.         b++;
  33.  
  34.     }
  35.     I2C_STOP();
  36. }
  37.  
  38.  
  39.  
  40. void si_write_reg(uint16_t *mybuf , uint8_t rejestr)
  41. {
  42.  
  43.  
  44.     I2C_START();
  45.     _delay_ms(100);
  46.     i2cPutbyte(32);
  47.     uint8_t z;
  48.  
  49.     for(z=2;z<=rejestr;z++)
  50.     {
  51.         uint8_t a;
  52.         uint8_t b;
  53.         a = (mybuf[z] >> 8);
  54.         b = (mybuf[z]);
  55.         i2cPutbyte(a);
  56.         i2cPutbyte(b);
  57.     }
  58.  
  59.     I2C_STOP();
  60.     //uint16_t regs[16];
  61.     //_delay_ms(200);
  62.     //si_read_reg(regs);
  63.  
  64.  
  65.     I2C_START();
  66.         i2cPutbyte(32);
  67.  
  68.         for(z=2;z<=7;z++)
  69.         {
  70.             uint8_t a;
  71.             uint8_t b;
  72.             a = (mybuf[z] >> 8);
  73.             b = (mybuf[z]);
  74.             i2cPutbyte(a);
  75.             i2cPutbyte(b);
  76.         }
  77.  
  78.         I2C_STOP();
  79.  
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86. void si_init(void)
  87. {
  88.     uint16_t init_tab[16];          // tablica przechowywująca wartosci rejestrów, mozna zoptymalizowac tylko do potrzebnych 6 wartosci
  89.  
  90.  
  91.     RST_O;                          // ustawienie pinu reset jako wyjscie
  92.     i2c_init();                     // inicjalizacja i2c
  93.  
  94.  
  95.  
  96.     RST_L;
  97.     _delay_ms(1);
  98.     RST_H;
  99.     _delay_ms(1);
  100.  
  101.     si_read_reg(init_tab);          // odczytanie początkowej wartosci rejestrów, można dac konkretne wartosci na starcie i to pominac
  102.     init_tab[0x07] =  0x8100;       // ustawienie wewnętrznego oscylatora
  103.     si_write_reg(init_tab, ALL);    // wpisanie wartoci rejestrów
  104.     _delay_ms(500);                 // czas oczekiwania na stabilizacje wg datasheet
  105.  
  106.     si_read_reg(init_tab);          // odczytanie wartosci rejestrów, równiez mozna dac konkretne wartosci ale tutaj beda juz inne nic przy poprzednim odczytaniu
  107.     init_tab[0x02] =  0xC001;       // rejestr POWERCONFIG ustawienie bitów DSMUTE DMUTE ENABLE   C301 dziala cokolwiek(autotune)
  108.     init_tab[0x03] =  0x80CD;       // rejestr CHANNEL ustawienie bitów TUNE(trzeba wyzerowac przed kolejnym ustawieniem freq) oraz kanału na najmłodsyzch 10 bitach
  109.     init_tab[0x04] =  0x1800;       // rejestr SYSCONFIG1 ustawenie bitu RDS(rds enable) oraz DE(??) na 1 = 50 µs. Used in Europe, Australia, Japan.
  110.     init_tab[0x05] =  0x0014;       // rejestr SYSCONFIG2 ustawienie bitu SPACE0(wybór skoku na 100kHz), głosnosci na 4 ostatnich bitach
  111.     init_tab[0x07] =  0x8000;
  112.  
  113.     si_write_reg(init_tab , 7);     // wpisanie wartosci do pierwszych 5 rejestrów(adresy 0x02- 0x06)
  114.     _delay_ms(110);                 // maxymalny czas oczekiwania
  115.     si_read_reg(init_tab);
  116.     init_tab[CHANNEL] &= 0x7C00;    // wyzerowanie bitu tune oraz channel
  117.     si_write_reg(init_tab,3);
  118.     _delay_ms(200);
  119.  
  120.  
  121. }
  122.  
  123. void si_set_channel(uint16_t si_channel)
  124. {
  125.     uint16_t channel_tab[16];
  126.  
  127.     si_read_reg(channel_tab);
  128.  
  129.     channel_tab[5] = 0;
  130.  
  131.  
  132.  
  133.     channel_tab[CHANNEL] |= (si_channel);
  134.     si_write_reg(channel_tab , 3);
  135.  
  136.  
  137.     _delay_ms(2000);
  138.     _delay_ms(100);
  139.     channel_tab[CHANNEL] |=  (0x8000);
  140.     si_write_reg(channel_tab , 3);
  141.     _delay_ms(2000);
  142. }
  143.  
  144.  
  145. void si_set_volume(uint8_t si_vol)
  146. {
  147.  
  148.     uint16_t vol_tab[16];
  149.     _delay_ms(200);
  150.     //if(si_vol > 15) return;       // jezeli wartosc mniejsza jak zero lub wieksza jak 15 opusc funkcje
  151.  
  152.  
  153.     //si_read_reg(vol_tab);         // odczytanie aktualnego stanu rejestrów
  154.     //vol_tab[SYS_CONF_2] &= 0xFFF0;    // wyzerowanie bitow odpoweidzialnych za glosnosc
  155.     //vol_tab[SYS_CONF_2] |= si_vol;    // ustawnienie glosnosci
  156.     vol_tab[SYS_CONF_2] = 0x0016;
  157.     si_write_reg(vol_tab , 5);      // wpisanie wartosci rejestrow
  158.     _delay_ms(100);
  159.  
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement