SPI и Тюнер Fm

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Прошу совета.
Нужно управлять микросхемой синтезатора частот Тюнера. согласно даташиту структура передачи данных:
8 бит выбор адреса, после чего сигнал SS (выборки) выставляется в "1" для передачи даных, а сигнал синхронизации 1 такт остается в "1",
после чего передается 40 бит данных.

это возможно сделать, используя стандартную библиотеку?

 

меня хватило только на это, но по осцилографу  нет сигнала синхронизации. :(

#include <SPI.h>


  // кнопки управления
#define keyUP 6
#define keyDOUN 5 
#define keyPL  4

     int frequlow = 128;
     int frequhigt = 128;

void setup() {

   SPI.begin();
   pinMode(7, OUTPUT);   //пин для выборки с задержкой между адресом и даными
   SPI.setDataMode(3);

  
  // Initializes TB2118F chip
  //first  40 bytes of the chip
  digitalWrite(7,LOW);
  digitalWrite(SS,LOW);
  shiftOut(MOSI, SCK, MSBFIRST, 0x03);      //адрес инициализации
  digitalWrite(7,HIGH);                     // выборка
  shiftOut(MOSI, SCK, LSBFIRST, frequlow);   // 16 бит (младший байт)
  shiftOut(MOSI, SCK, LSBFIRST, frequhigt);  // (старший байт)
  shiftOut(MOSI, SCK, MSBFIRST, 0x20);
  shiftOut(MOSI, SCK, MSBFIRST, 0x88);
  shiftOut(MOSI, SCK, MSBFIRST, 0x20);
  digitalWrite(SS,HIGH);
  digitalWrite(7,LOW);
  delay(100);

}

void loop() {
  

  // frequency change TB2118F chip
  //first  24 bytes of the chip
  digitalWrite(7,LOW);
  digitalWrite(SS,LOW);
  shiftOut(MISO, SCK, MSBFIRST, 0x01);
  digitalWrite(7,HIGH); 
  shiftOut(MOSI, SCK, LSBFIRST, frequlow);
  shiftOut(MOSI, SCK, LSBFIRST, frequhigt);
  shiftOut(MOSI, SCK, MSBFIRST, 0x20);
  //shiftOut(MOSI, SCK, MSBFIRST, 0x88);
  //shiftOut(MOSI, SCK, MSBFIRST, 0x20);
  digitalWrite(SS,HIGH);
  digitalWrite(7,LOW);

  
    pinMode(keyUP, INPUT_PULLUP);
    pinMode(keyDOUN, INPUT_PULLUP);
    pinMode(keyPL, INPUT_PULLUP);
   

        // обработка кнопок
  if (!digitalRead(keyUP) && !digitalRead(keyPL)){   // регулировка частоты вверх
    
    frequlow++;
    if (frequlow > 255 && frequhigt < 255) frequlow = 0, frequhigt++;
    if (frequhigt > 254 && frequlow == 255) frequlow = 0, frequhigt = 0;
   delay(100); 
  }
  if (!digitalRead(keyDOUN) && !digitalRead(keyPL)){   // регулировка частоты вниз
    
    frequlow--;
    if (frequlow == 0 && frequhigt >= 1) frequlow = 255, frequhigt--;
    if (frequhigt == 0 && frequlow == 0) frequlow = 255, frequhigt = 255;
   delay(100);
  }

}

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Сам себе отвечу - удалось добиться инициализации тюнера. s скетч был не рабочий из-за оператора shiftOut,  заменил его на

SPI.transfer, может дело в библиотеках.

рабочий код:

#include <SPI.h>

  // кнопки управления
#define keyUP 6
#define keyDOUN 5 
#define keyPL  4

     int frequlow = 16;
     int frequhigt = 0;

void setup() {
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV32);
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(LSBFIRST); //первым младший бит


   // Initializes TB2118F chip
   //first  40 bytes of the chip

  //устанавливаем режим порта выхода
  pinMode(SS, OUTPUT);
  pinMode(SCK, OUTPUT);
  pinMode(MOSI, OUTPUT);
  pinMode(7, OUTPUT);   //пин для выборки с задержкой между адресом и даными

     digitalWrite(SS, LOW); //устанавливаем LOW на SS пока не окончена передача байта
     digitalWrite(7, LOW);        //пин для выборки с задержкой между адресом и даными
    SPI.transfer(0xC0);  //адрес инициализации
    digitalWrite(7, HIGH);
    
    SPI.transfer(frequlow);
    SPI.transfer(frequhigt); 
      
      SPI.transfer(0x04);
      
      SPI.transfer(0x11);
      SPI.transfer(0x04);
    //устанавливаем HIGH на SS, чтобы проинформировать регистр, что передача окончена.
    digitalWrite(SS, HIGH);
    digitalWrite(7, LOW);
    delay(10);
}

void loop(){


  // frequency change TB2118F chip
  //first  24 bytes of the chip
  
     digitalWrite(SS, LOW); //устанавливаем LOW на SS пока не окончена передача байта
     digitalWrite(7, LOW);        //пин для выборки с задержкой между адресом и даными
    SPI.transfer(0xA0);        //адрес инициализации настройки частоты
    digitalWrite(7, HIGH);

    SPI.transfer(frequlow);  // младший байт
    SPI.transfer(frequhigt); // старший байт
      SPI.transfer(0x06);
      

    digitalWrite(SS, HIGH);
    digitalWrite(7, LOW);
    delay(10);
    
    pinMode(keyUP, INPUT_PULLUP);
    pinMode(keyDOUN, INPUT_PULLUP);
    pinMode(keyPL, INPUT_PULLUP);
   

        // обработка кнопок
  if (!digitalRead(keyUP))
  {   // регулировка частоты вверх
    
    frequlow = frequlow + 16;
    if (frequlow > 255 && frequhigt < 255) frequlow = 0, frequhigt++;
    if (frequhigt > 254 && frequlow >= 255) frequlow = 0, frequhigt = 0;
   delay(100); 
  }
  if (!digitalRead(keyDOUN)){  
    // регулировка частоты вниз
    
    frequlow = frequlow - 16;
    if (frequlow <= 0 && frequhigt >= 1) frequlow = 255, frequhigt--;
    if (frequhigt == 0 && frequlow == 0) frequlow = 255, frequhigt = 255;
   delay(100);
  }

}