Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * si4703.c
- *
- * Created on: 13-04-2013
- * 14:11:02
- * Author: miszczo
- */
- #include <avr/io.h>
- #include <util/delay.h>
- #include "si4703.h"
- #include "I2C/i2c_soft.h"
- void si_read_reg(uint16_t *mybuf)
- {
- uint8_t a; // zmienne pomocnicze
- uint8_t b; //
- I2C_START();
- i2cPutbyte(0x21); // adres si read
- // _delay_ms(700); //TEGO TO BY MOGLO NIE BYC HEHE
- for(b=0x0A;;)
- {
- if(b == 0x10) b = 0x00;
- a = i2cGetbyte(1);
- mybuf[b] = (a<<8);
- a = i2cGetbyte(1);
- mybuf[b] |= a;
- if(b == 0x09) return;
- b++;
- }
- I2C_STOP();
- }
- void si_write_reg(uint16_t *mybuf , uint8_t rejestr)
- {
- I2C_START();
- _delay_ms(100);
- i2cPutbyte(32);
- uint8_t z;
- for(z=2;z<=rejestr;z++)
- {
- uint8_t a;
- uint8_t b;
- a = (mybuf[z] >> 8);
- b = (mybuf[z]);
- i2cPutbyte(a);
- i2cPutbyte(b);
- }
- I2C_STOP();
- //uint16_t regs[16];
- //_delay_ms(200);
- //si_read_reg(regs);
- I2C_START();
- i2cPutbyte(32);
- for(z=2;z<=7;z++)
- {
- uint8_t a;
- uint8_t b;
- a = (mybuf[z] >> 8);
- b = (mybuf[z]);
- i2cPutbyte(a);
- i2cPutbyte(b);
- }
- I2C_STOP();
- }
- void si_init(void)
- {
- uint16_t init_tab[16]; // tablica przechowywująca wartosci rejestrów, mozna zoptymalizowac tylko do potrzebnych 6 wartosci
- RST_O; // ustawienie pinu reset jako wyjscie
- i2c_init(); // inicjalizacja i2c
- RST_L;
- _delay_ms(1);
- RST_H;
- _delay_ms(1);
- si_read_reg(init_tab); // odczytanie początkowej wartosci rejestrów, można dac konkretne wartosci na starcie i to pominac
- init_tab[0x07] = 0x8100; // ustawienie wewnętrznego oscylatora
- si_write_reg(init_tab, ALL); // wpisanie wartoci rejestrów
- _delay_ms(500); // czas oczekiwania na stabilizacje wg datasheet
- si_read_reg(init_tab); // odczytanie wartosci rejestrów, równiez mozna dac konkretne wartosci ale tutaj beda juz inne nic przy poprzednim odczytaniu
- init_tab[0x02] = 0xC001; // rejestr POWERCONFIG ustawienie bitów DSMUTE DMUTE ENABLE C301 dziala cokolwiek(autotune)
- init_tab[0x03] = 0x80CD; // rejestr CHANNEL ustawienie bitów TUNE(trzeba wyzerowac przed kolejnym ustawieniem freq) oraz kanału na najmłodsyzch 10 bitach
- init_tab[0x04] = 0x1800; // rejestr SYSCONFIG1 ustawenie bitu RDS(rds enable) oraz DE(??) na 1 = 50 µs. Used in Europe, Australia, Japan.
- init_tab[0x05] = 0x0014; // rejestr SYSCONFIG2 ustawienie bitu SPACE0(wybór skoku na 100kHz), głosnosci na 4 ostatnich bitach
- init_tab[0x07] = 0x8000;
- si_write_reg(init_tab , 7); // wpisanie wartosci do pierwszych 5 rejestrów(adresy 0x02- 0x06)
- _delay_ms(110); // maxymalny czas oczekiwania
- si_read_reg(init_tab);
- init_tab[CHANNEL] &= 0x7C00; // wyzerowanie bitu tune oraz channel
- si_write_reg(init_tab,3);
- _delay_ms(200);
- }
- void si_set_channel(uint16_t si_channel)
- {
- uint16_t channel_tab[16];
- si_read_reg(channel_tab);
- channel_tab[5] = 0;
- channel_tab[CHANNEL] |= (si_channel);
- si_write_reg(channel_tab , 3);
- _delay_ms(2000);
- _delay_ms(100);
- channel_tab[CHANNEL] |= (0x8000);
- si_write_reg(channel_tab , 3);
- _delay_ms(2000);
- }
- void si_set_volume(uint8_t si_vol)
- {
- uint16_t vol_tab[16];
- _delay_ms(200);
- //if(si_vol > 15) return; // jezeli wartosc mniejsza jak zero lub wieksza jak 15 opusc funkcje
- //si_read_reg(vol_tab); // odczytanie aktualnego stanu rejestrów
- //vol_tab[SYS_CONF_2] &= 0xFFF0; // wyzerowanie bitow odpoweidzialnych za glosnosc
- //vol_tab[SYS_CONF_2] |= si_vol; // ustawnienie glosnosci
- vol_tab[SYS_CONF_2] = 0x0016;
- si_write_reg(vol_tab , 5); // wpisanie wartosci rejestrow
- _delay_ms(100);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement