26

Re: SI4703

Кварц поменял- ничего не изменилось! Видать модуль дохлый совсем!

27 (2022-01-11 15:11:51 отредактировано samand587)

Re: SI4703

Модуль мой очень даже живой. Проверил тестовыми скетчами(прилагаю). Все ищется и поет! Чего не хватает, Х.З.!Данный контент доступен только зарегистрированным пользователям.

28 (2022-01-12 01:03:17 отредактировано sevmakc)

Re: SI4703

http://forum.rcl-radio.ru/uploads/images/2022/01/66ba9af873fa3fd9ef3a29b9c85545a3.jpg

Тоже самое и у меня на экране... Громкость только регулируется, радио не играет...

http://forum.rcl-radio.ru/uploads/images/2022/01/6642f70a652f4592814e9a6c8f77643d.jpg

Это ваш тестовый скетч. Отправлял символы u или d, реакции нет

Модуль рабочий проверен на другом тестовом скетче
Прошу помощи

29

Re: SI4703

Библиотека - Данный контент доступен только зарегистрированным пользователям.


Проверьте схему соединения

http://forum.rcl-radio.ru/uploads/images/2022/01/99dae35c6da6b4530455b7f6b56ee66e.png

загрузите тестовый скетч

#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
http://forum.rcl-radio.ru/uploads/images/2022/01/d73436030936f10ed95e77ef9d4fc66b.png

http://forum.rcl-radio.ru/uploads/images/2022/01/5016b1ad1f38e3ba52003c3151487630.png

30

Re: SI4703

Отправьте в монитор порта u  и  d  для поиска станции

31

Re: SI4703

Здравствуйте! Повторил в точности как советовали выше. Вот картинки с монитора и дисплея. На команды u и d реакции нет. Регулируется только громкость. Библиотеку поставил Вашу. 
http://forum.rcl-radio.ru/uploads/images/2022/01/0b8c2ff9b6654677fd47c4e2c7361ad2.png
http://forum.rcl-radio.ru/uploads/images/2022/01/e69cd296e0216e07ac3fad87e73922f4.png

32

Re: SI4703

http://forum.rcl-radio.ru/uploads/images/2022/01/17d0965a0479a3878c1b7d19344b93ba.png
CHIP ID 800


У Вас модуль Si4700/01 ?

33

Re: SI4703

У меня вот такой https://aliexpress.ru/item/32817712100. … 4aa6cwVy5n

34

Re: SI4703

liman324 пишет:

У Вас модуль Si4700/01 ?

Посмотрел даташиты- ни где не указано про ревизии( наверное плохо смотрел). Как можно определить ревизию?

35

Re: SI4703

CHIP ID дает информацию о чипе

у меня Si4703C19 Reset value = 0x1253
у Вас Reset value = 0x0800 for Si4700/01 Revision B.

36

Re: SI4703

у меня такой модуль - https://aliexpress.ru/item/32412451595. … 8343734602

37

Re: SI4703

Спасибо за информацию! И главный вопрос- как дальше действовать?

38

Re: SI4703

в файле библиотеки si4703.cpp
замените pr_si_write(0x07,0x8100);// кварц
на pr_si_write(0x07,0x0000);// кварц

если не поможет, то надо искать различия в регистрах 4701 и 4703

39

Re: SI4703

К сожалению это не помогло. Все та же каша на экране, работает только громкость + -. Тестовый скетч показывает вот
http://forum.rcl-radio.ru/uploads/images/2022/01/fe1544332dd2750751d9a617e83186cb.png

40

Re: SI4703

К сожалению моя библиотека не будет работать с ваши чипом, по даташитам есть небольшая разница в регистрах si4703 и si4701.
Вам лучше использовать другую библиотеку с которой работает Ваш модуль.

41

Re: SI4703

liman324 пишет:

... лучше использовать другую библиотеку...

Перебрал несколько библиотек- работать не хочет!

42

Re: SI4703

Я внес небольшие правки в библиотеку, но не уверен будет ли модуль работать.
Замените весь файл 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;  
  }  

43

Re: SI4703

К сожалению ничего не изменилось. Все то же, что писал выше

44

Re: SI4703

без модуля я не смогу поправить библиотеку.

45 (2022-01-12 20:17:02 отредактировано samand587)

Re: SI4703

Я модуль проверял на ЕСП32 вот этими тестами. Настраивается и поет. Правда в самом проекте http://forum.amperka.ru/threads/fm-ради … ost-288899 работать не хочет, от слова совсем. А у автора там модуль такой же как здесь. Вот такая Х...!

Данный контент доступен только зарегистрированным пользователям.

46

Re: SI4703

Вы же скетч с моей библиотекой не через i2c подключаете?

47

Re: SI4703

Замените весь файл 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;  
  }  

48 (2022-01-12 20:49:49 отредактировано samand587)

Re: SI4703

Такая ошибка: "Ошибка компиляции для платы Arduino Nano." Не понял вопроса по подключению скетча. Все делаю по Вашим рекомендациям. Скетч для ЕСП привел для примера, что модуль рабочий

49

Re: SI4703

У меня компиляция проходит без ошибок

50 (2022-01-12 21:02:03 отредактировано samand587)

Re: SI4703

Залил- на экране ничего не изменилось. В наушниках при нажатии кнопки + - каналов писк.