Re: SI4703
Кварц поменял- ничего не изменилось! Видать модуль дохлый совсем!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Библиотеки → SI4703
Кварц поменял- ничего не изменилось! Видать модуль дохлый совсем!
Модуль мой очень даже живой. Проверил тестовыми скетчами(прилагаю). Все ищется и поет! Чего не хватает, Х.З.!Данный контент доступен только зарегистрированным пользователям.
Тоже самое и у меня на экране... Громкость только регулируется, радио не играет...
Это ваш тестовый скетч. Отправлял символы u или d, реакции нет
Модуль рабочий проверен на другом тестовом скетче
Прошу помощи
Библиотека - Данный контент доступен только зарегистрированным пользователям.
Проверьте схему соединения
загрузите тестовый скетч
#include <si4703.h>
si4703 radio(3,2,4,5); // SDIO, SCLK, SEN, RST
int f_cannel = 1019;
void setup() {
radio.init();
Serial.begin(9600);
Serial.print("Device ID: ");Serial.println(radio.read_device_id(),HEX);
Serial.print("Chip ID: ");Serial.println(radio.read_chip_id(),HEX);
delay(10000);
radio.fm_start(f_cannel-760);
radio.si_volume(10);// 0...15
}
void loop() {
if(Serial.available()){
char serial = Serial.read();
if(serial == 'u'){radio.seek_up();}
if(serial == 'd'){radio.seek_down();}
}
Serial.print(" F = ");
Serial.print(float((radio.nom_ch()+760.00)/10),2);
Serial.print(" RDS =");
Serial.print(radio.readRDS());
Serial.print(" STC =");
Serial.print(radio.seach());
Serial.print(" RSSI =");
Serial.print(radio.rss());
Serial.print(" ST =");
Serial.println(radio.st_mn());
}
в первых строках должны быть номера ID
Отправьте в монитор порта u и d для поиска станции
Здравствуйте! Повторил в точности как советовали выше. Вот картинки с монитора и дисплея. На команды u и d реакции нет. Регулируется только громкость. Библиотеку поставил Вашу.
CHIP ID 800
У Вас модуль Si4700/01 ?
У меня вот такой https://aliexpress.ru/item/32817712100. … 4aa6cwVy5n
У Вас модуль Si4700/01 ?
Посмотрел даташиты- ни где не указано про ревизии( наверное плохо смотрел). Как можно определить ревизию?
CHIP ID дает информацию о чипе
у меня Si4703C19 Reset value = 0x1253
у Вас Reset value = 0x0800 for Si4700/01 Revision B.
у меня такой модуль - https://aliexpress.ru/item/32412451595. … 8343734602
Спасибо за информацию! И главный вопрос- как дальше действовать?
в файле библиотеки si4703.cpp
замените pr_si_write(0x07,0x8100);// кварц
на pr_si_write(0x07,0x0000);// кварц
если не поможет, то надо искать различия в регистрах 4701 и 4703
К сожалению это не помогло. Все та же каша на экране, работает только громкость + -. Тестовый скетч показывает вот
К сожалению моя библиотека не будет работать с ваши чипом, по даташитам есть небольшая разница в регистрах si4703 и si4701.
Вам лучше использовать другую библиотеку с которой работает Ваш модуль.
... лучше использовать другую библиотеку...
Перебрал несколько библиотек- работать не хочет!
Я внес небольшие правки в библиотеку, но не уверен будет ли модуль работать.
Замените весь файл si4703.cpp
#include <Arduino.h>
#include <si4703.h>
unsigned int _reg2,_reg3,_reg4,_reg5,_reg6;
si4703::si4703(uint8_t sdio, uint8_t sclk, uint8_t sen, uint8_t rst){
SDIO = sdio;
SCLK = sclk;
SEN = sen;
RST = rst;
pinMode(SDIO,OUTPUT);
pinMode(SCLK,OUTPUT);
pinMode(SEN,OUTPUT);
pinMode(RST,OUTPUT);
}
void si4703::init(){
digitalWrite(RST,LOW);delay(1);
digitalWrite(RST,HIGH);delay(1);
pr_si_write(0x07,0x0000);// кварц
delay(500);
pr_si_write(0x02,_reg2|=0xC001);
pr_si_write(0x06,_reg6|=0b11111|(1<<15)|(1<<14));// фильтр поиска
pr_si_write(0x04,_reg4|=(1<<11)|(1<<7)|(1<<10));
pr_si_write(0x05,_reg5|=(1<<6)|(1<<4));
delay(200);
}
int si4703::read_device_id(){return pr_si_read(0);}
int si4703::read_chip_id(){return pr_si_read(1);}
int si4703::rss(){return pr_si_read(0x0A) & 0xFF;}
int si4703::nom_ch(){return pr_si_read(0x0B) & 0x3FF;}
bool si4703::st_mn(){return (pr_si_read(0x0A)>>8) & 0x01;}
bool si4703::rds_sinh(){return (pr_si_read(0x0A)>>11) & 0x01;}
bool si4703::pr_rds_status(){return (pr_si_read(0x0A) >> 15) & 0x01;}
bool si4703::pr_rds_st_name(){return (pr_si_read(0x0D) >> 11) == 0 || (pr_si_read(0x0D) >> 11) == 1;}
bool si4703::pr_rds_byte_length(byte rds_data){return rds_data >= 32 && rds_data <= 127;}
void si4703::pr_stc(){while((pr_si_read(0x0A)>>14) & 0x01 == 0);}
bool si4703::seach(){return (pr_si_read(0x0A)>>14) & 0x01;}
void si4703::si_volume(int vol){pr_stc();pr_si_write(0x05,_reg5=(1<<6)|(1<<4)|vol);}
bool si4703::pr_rds_st_error() {
byte _rds_error = (byte)((pr_si_read(0x0A) & 0x0600) >> 9);
byte Dh = (pr_si_read(0x0F) & 0xFF00) >> 8;
byte Dl = (pr_si_read(0x0F) & 0x00FF);
return _rds_error == 0 && pr_rds_byte_length(Dh) && pr_rds_byte_length(Dl);
}
char * si4703::readRDS(){
char rdsBuffer[8];
char * buffer = rdsBuffer;
boolean completed[] = {false, false, false, false};
int completedCount = 0;
if(pr_rds_status()){
while(completedCount < 4) {
if(pr_rds_st_name() && pr_rds_st_error()){
uint16_t b = pr_si_read(0x0d);
int index = b & 0x3;
completed[index] = true;
completedCount ++;
byte Dh = (pr_si_read(0x0F) & 0xFF00) >> 8;
byte Dl = (pr_si_read(0x0F) & 0x00FF);
buffer[index * 2] = Dh;
buffer[index * 2 + 1] = Dl;
delay(40);}else{delay(30);}}return buffer;}
}
void si4703::fm_start(int ch){
delay(200);
pr_stc();pr_si_write(0x03,_reg3|=ch);
pr_stc();pr_si_write(0x03,_reg3|=(1<<15));
delay(200);
}
void si4703::seek_up(){
pr_stc();pr_si_write(0x03,_reg3 = 0);
pr_stc();pr_si_write(0x02,_reg2 &=~(1<<8));
pr_stc();pr_si_write(0x02,_reg2 |= (1<<8)|(1<<9));
}
void si4703::seek_down(){
pr_stc();pr_si_write(0x03,_reg3 = 0);
pr_stc();pr_si_write(0x02,_reg2 &=~(1<<8));
_reg2 |= (1<<8);_reg2 &=~(1<<9);
pr_stc();pr_si_write(0x02,_reg2);
}
void si4703::pr_si_write(byte _si_reg, unsigned int _si_data){
pinMode(SDIO,OUTPUT);
digitalWrite(SCLK,LOW);
digitalWrite(SEN,LOW);
int _addr = (0b01100 << 4) | _si_reg;
for(int i = 8; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_addr >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_si_data >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
digitalWrite(SCLK,LOW);
digitalWrite(SEN,HIGH);
digitalWrite(SCLK,HIGH);
}
unsigned int si4703::pr_si_read(byte _si_reg){
unsigned int _si_byte_read = 0;
bool _si_bit_read[16];
pinMode(SDIO,OUTPUT);
digitalWrite(SCLK,LOW);
digitalWrite(SEN,LOW);
int _addr = (0b01110 << 4) | _si_reg;
for(int i = 8; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_addr >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
digitalWrite(SCLK,LOW);
pinMode(SDIO,INPUT);
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,HIGH);
_si_bit_read[i] = digitalRead(SDIO);
_si_byte_read = _si_byte_read + (_si_bit_read[i] << i);
digitalWrite(SCLK,LOW);
}
digitalWrite(SEN,HIGH);
digitalWrite(SCLK,HIGH);
return _si_byte_read;
}
К сожалению ничего не изменилось. Все то же, что писал выше
без модуля я не смогу поправить библиотеку.
Я модуль проверял на ЕСП32 вот этими тестами. Настраивается и поет. Правда в самом проекте http://forum.amperka.ru/threads/fm-ради … ost-288899 работать не хочет, от слова совсем. А у автора там модуль такой же как здесь. Вот такая Х...!
Данный контент доступен только зарегистрированным пользователям.
Вы же скетч с моей библиотекой не через i2c подключаете?
Замените весь файл si4703.cpp
#include <Arduino.h>
#include <si4703.h>
unsigned int _reg2,_reg3,_reg4,_reg5,_reg6;
si4703::si4703(uint8_t sdio, uint8_t sclk, uint8_t sen, uint8_t rst){
SDIO = sdio;
SCLK = sclk;
SEN = sen;
RST = rst;
pinMode(SDIO,OUTPUT);
pinMode(SCLK,OUTPUT);
pinMode(SEN,OUTPUT);
pinMode(RST,OUTPUT);
}
void si4703::init(){
digitalWrite(RST,LOW);delay(1);
digitalWrite(RST,HIGH);delay(1);
pr_si_write(0x07,0x0000 | (1<<14));
delay(500);
pr_si_write(0x02,_reg2|=0xC001);
pr_si_write(0x06,_reg6|=0b11111|(1<<15)|(1<<14));// фильтр поиска
pr_si_write(0x04,_reg4|=(1<<11)|(1<<7)|(1<<10));
pr_si_write(0x05,_reg5|=(1<<6)|(1<<4));
delay(200);
}
int si4703::read_device_id(){return pr_si_read(0);}
int si4703::read_chip_id(){return pr_si_read(1);}
int si4703::rss(){return pr_si_read(0x0A) & 0xFF;}
int si4703::nom_ch(){return pr_si_read(0x0B) & 0x3FF;}
bool si4703::st_mn(){return (pr_si_read(0x0A)>>8) & 0x01;}
bool si4703::rds_sinh(){return (pr_si_read(0x0A)>>11) & 0x01;}
bool si4703::pr_rds_status(){return (pr_si_read(0x0A) >> 15) & 0x01;}
bool si4703::pr_rds_st_name(){return (pr_si_read(0x0D) >> 11) == 0 || (pr_si_read(0x0D) >> 11) == 1;}
bool si4703::pr_rds_byte_length(byte rds_data){return rds_data >= 32 && rds_data <= 127;}
void si4703::pr_stc(){while((pr_si_read(0x0A)>>14) & 0x01 == 0);}
bool si4703::seach(){return (pr_si_read(0x0A)>>14) & 0x01;}
void si4703::si_volume(int vol){pr_stc();pr_si_write(0x05,_reg5=(1<<6)|(1<<4)|vol);}
bool si4703::pr_rds_st_error() {
byte _rds_error = (byte)((pr_si_read(0x0A) & 0x0600) >> 9);
byte Dh = (pr_si_read(0x0F) & 0xFF00) >> 8;
byte Dl = (pr_si_read(0x0F) & 0x00FF);
return _rds_error == 0 && pr_rds_byte_length(Dh) && pr_rds_byte_length(Dl);
}
char * si4703::readRDS(){
char rdsBuffer[8];
char * buffer = rdsBuffer;
boolean completed[] = {false, false, false, false};
int completedCount = 0;
if(pr_rds_status()){
while(completedCount < 4) {
if(pr_rds_st_name() && pr_rds_st_error()){
uint16_t b = pr_si_read(0x0d);
int index = b & 0x3;
completed[index] = true;
completedCount ++;
byte Dh = (pr_si_read(0x0F) & 0xFF00) >> 8;
byte Dl = (pr_si_read(0x0F) & 0x00FF);
buffer[index * 2] = Dh;
buffer[index * 2 + 1] = Dl;
delay(40);}else{delay(30);}}return buffer;}
}
void si4703::fm_start(int ch){
delay(200);
pr_stc();pr_si_write(0x03,_reg3|=ch);
pr_stc();pr_si_write(0x03,_reg3|=(1<<15));
delay(200);
}
void si4703::seek_up(){
pr_stc();pr_si_write(0x03,_reg3 = 0);
pr_stc();pr_si_write(0x02,_reg2 &=~(1<<8));
pr_stc();pr_si_write(0x02,_reg2 |= (1<<8)|(1<<9));
}
void si4703::seek_down(){
pr_stc();pr_si_write(0x03,_reg3 = 0);
pr_stc();pr_si_write(0x02,_reg2 &=~(1<<8));
_reg2 |= (1<<8);_reg2 &=~(1<<9);
pr_stc();pr_si_write(0x02,_reg2);
}
void si4703::pr_si_write(byte _si_reg, unsigned int _si_data){
pinMode(SDIO,OUTPUT);
digitalWrite(SCLK,LOW);
digitalWrite(SEN,LOW);
int _addr = (0b01100 << 4) | _si_reg;
for(int i = 8; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_addr >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_si_data >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
digitalWrite(SCLK,LOW);
digitalWrite(SEN,HIGH);
digitalWrite(SCLK,HIGH);
}
unsigned int si4703::pr_si_read(byte _si_reg){
unsigned int _si_byte_read = 0;
bool _si_bit_read[16];
pinMode(SDIO,OUTPUT);
digitalWrite(SCLK,LOW);
digitalWrite(SEN,LOW);
int _addr = (0b01110 << 4) | _si_reg;
for(int i = 8; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SDIO, (_addr >> i) & 0x01);
digitalWrite(SCLK,HIGH);
}
digitalWrite(SCLK,LOW);
pinMode(SDIO,INPUT);
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,HIGH);
_si_bit_read[i] = digitalRead(SDIO);
_si_byte_read = _si_byte_read + (_si_bit_read[i] << i);
digitalWrite(SCLK,LOW);
}
digitalWrite(SEN,HIGH);
digitalWrite(SCLK,HIGH);
return _si_byte_read;
}
Такая ошибка: "Ошибка компиляции для платы Arduino Nano." Не понял вопроса по подключению скетча. Все делаю по Вашим рекомендациям. Скетч для ЕСП привел для примера, что модуль рабочий
У меня компиляция проходит без ошибок
Залил- на экране ничего не изменилось. В наушниках при нажатии кнопки + - каналов писк.
forum.rcl-radio.ru → Библиотеки → SI4703
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|