SPI и Тюнер Fm
- Войдите на сайт для отправки комментариев
Втр, 23/08/2016 - 20:10
Прошу совета.
Нужно управлять микросхемой синтезатора частот Тюнера. согласно даташиту структура передачи данных:
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);
}
}
Сам себе отвечу - удалось добиться инициализации тюнера. 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); } }