Свежие обсуждения
Микроконтроллеры

TR24A. Кто запустил этот трансивер?

1 2

Всем привет!
Осваиваю трансивер TR24а (даташиты http://delanet.ru/content/view/532/39/) для передачи данных между МК по радиоканалу. Пытаюсь прицепить модуль к ATMega8L, но что-то не очень пока получается. Все делаю на основе кода китайца (http://delanet.ru/content/view/767/46/)
Может, кто-то это уже сделал? Или сможете обнаружить ошибку незамыленным глазом? Вот код

//www.bulkin.info
//Code for ATMega8L + TR24A

#include <mega8.h>
#include <delay.h>

#define IN 0
#define OUT 1

// Pins definitions Определение пинов ATMega8L - TR24A
#define nRST PORTB.1 // PB1 (OC1A) - RESET_n Сброс. Активный при низком сигнале.
#define SS PORTB.2 // PB2 (SS) - SPI_SS Slave select input Выбор активного устройства с SPI (высокий - активен?)
#define MOSI PORTB.3 // PB3 (MOSI) - SPI_MOSI Master Output Slave Input
#define MISO PORTB.4 // PB4 (MISO) - SPI_MISO Master Input Slave Out
#define CLK PORTB.5 // PB5 (SCK) - SPI_CLK SPI Clock. Тактирование обмена по SPI
#define FIFO PORTC.5 // PC5 - FIFO_FLAG First input First out buffer full/empty
#define TXRX PORTC.4 // PC4 - PKT_FLAG Transfer/Recive packet Отпрака/прием пакета

// Pins init Инифиализация пинов
void init_pins(void){
//Direction set. Установка пинов
//Измените имя порта и номер пина, если требуется: DDRB.4 -> DDRC.3 Порт B, пин 4 -> Порт С, пин 3
DDRB.1 = OUT; // nRST as out pin of MC ATMega8L
DDRB.2 = OUT; // SS as out pin
DDRB.3 = OUT; // MOSI
DDRB.4 = IN; // MISO as input
DDRB.5 = OUT; // CLK
DDRC.5 = IN; // FIFO
DDRC.4 = IN; // TXRX flag

//Очистка состояний пинов Default pin states setting
nRST = 0;
SS = 0;
MOSI = 0;
CLK = 0;
}

// Sends char (8 bits) through SPI to the module
// Посылает символ (8 бит) через SPI модулю
void Spi_Tx_Loop(unsigned char tx_data){
unsigned char temp;
int i;

for(i=0;i<8;i++){ // Send 8 bits
CLK = 1; // SPI_CLK high
temp = tx_data & 1;
if(temp) MOSI=1; //if first bit of tx_data = 1 then MOSI = 1
else MOSI=0; //else MOSI=0
tx_data=1; //Shift bit: 101000 -> 010001
delay_ms(1); // delay 1 ms
CLK = 0; // SPI_CLK low
delay_ms(1); // delay 1 ms
}
}

// Send register to SPI. Отправляет регистр по SPI.
void SpiTxReg(unsigned char rf_com, unsigned char rf_hb, unsigned char rf_lb){
SS = 1; // SS high (nonactive)
CLK = 0; // CLK low
SS = 0; // SS low (active)

Spi_Tx_Loop(rf_com); // command send
Spi_Tx_Loop(rf_hb); // high byte send
Spi_Tx_Loop(rf_lb); // low byte send

SS = 1; // SS high (nonactive)
CLK = 0; // CLK low
}

void INTO_TX(void){
SpiTxReg(0x52,0x80,0x00); //RESET TX
delay_ms(5);
SpiTxReg(0x07,0x01,0x10); //INTO TX
delay_ms(5);
}

// RF module init
void init_TR24A(void){
nRST = 0; // Reset active
delay_ms(30); // Wait 30 ms
nRST = 1; // Reset not active
delay_ms(30); // Wait 30 ms

//unsigned int rec_data; debug answer
//INITIAL REG48~REG58
SpiTxReg(0x30,0x98,0x00); //reg48
// rec_data=SpiRxReg(0x30);
SpiTxReg(0x31,0xFF,0x0F); //reg49
// rec_data=SpiRxReg(0x31);
SpiTxReg(0x32,0x80,0x28); //reg50
SpiTxReg(0x33,0x80,0x56); //reg51
SpiTxReg(0x34,0x4E,0xF6); //reg52
SpiTxReg(0x35,0xF6,0xF5); //reg53
SpiTxReg(0x36,0x18,0x5C); //reg54
SpiTxReg(0x37,0xD6,0x51); //reg55
SpiTxReg(0x38,0x44,0x04); //reg56
SpiTxReg(0x39,0xE0,0x00); //reg57
SpiTxReg(0x3a,0x00,0x00); //reg58
delay_ms(20); // delay for 20 ms
//INITIAL REG0~REG28
SpiTxReg(0x00,0x35,0x4F); //reg00
SpiTxReg(0x02,0x1F,0x01); //reg02
SpiTxReg(0x04,0x38,0xD8); //reg04
SpiTxReg(0x05,0x00,0xA1); //reg05
SpiTxReg(0x07,0x12,0x4C); //reg07
SpiTxReg(0x08,0x80,0x08); //reg08
SpiTxReg(0x09,0x21,0x01); //reg09
SpiTxReg(0x0A,0x00,0x04); //reg10
SpiTxReg(0x0B,0x40,0x41); //reg11
SpiTxReg(0x0C,0x7E,0x00); //reg12
SpiTxReg(0x0D,0x00,0x00); //reg13
SpiTxReg(0x0E,0x16,0x9D); //reg14
SpiTxReg(0x0F,0x80,0x2F); //reg15
SpiTxReg(0x10,0xB0,0xF8); //reg16
// SpiTxReg(0x11,0x00,0x66); //reg17
SpiTxReg(0x12,0xE0,0x00); //reg18
SpiTxReg(0x13,0xA1,0x14); //reg19
SpiTxReg(0x14,0x81,0x91); //reg20
SpiTxReg(0x15,0x69,0x62); //reg21
SpiTxReg(0x16,0x00,0x02); //reg22
SpiTxReg(0x17,0x00,0x02); //reg23
SpiTxReg(0x18,0xB1,0x40); //reg24
SpiTxReg(0x19,0x78,0x0F); //reg25
SpiTxReg(0x1A,0x3F,0x04); //reg26
// SpiTxReg(0x1B,0x80,0x00); //reg27
SpiTxReg(0x1C,0x58,0x00); //reg28
SpiTxReg(0x07,0x00,0x00); //Completed to enter the Idle Mode
}

void Write_FIFO_Start(unsigned char rf_com,unsigned char tx_leng){
// FIFO write start Начало записи в буффер FIFO
SS = 1;
CLK = 0;
SS = 0;
Spi_Tx_Loop(rf_com); //SPI command
Spi_Tx_Loop(tx_leng); //SPI TX length
}

void Write_FIFO_End(void){
SS = 1;
CLK = 0;
}

void Write_FIFO_data(unsigned char tx_data){ Spi_Tx_Loop(tx_data); }

void WRITE_FIFO(unsigned char tx_leng,unsigned char tx_data){
// Write data in First-in-first-out buffer to TX
// Запись данных в буффер FIFO для передачи
int i;
SpiTxReg(0x52,0x80,0x00); //RESET TX Сброс передачи
delay_ms(5); //delay 5 ms

Write_FIFO_Start(0x50,tx_leng); //WRITE FIFO Запуск записи в FIFO

for(i=0; itx_leng; i++) Write_FIFO_data(tx_data); //Запись данных

Write_FIFO_End(); //Окончание записи в FIFO
SpiTxReg(0x07,0x01,0x10); //INTO TX В режим передачи
delay_ms(5); //delay 5 ms
// i = 0;
//while( i == 0) //If PKT_FLAG = 0 while waiting, one down the implementation of equal
//{
//i = Port_B; //But here there is no role Application Notes Say io can read this data to determine whether the transfer is complete
//i &= PKT_FLAG; //Check pkt_flag
//}
SpiTxReg(0x52,0x80,0x00); //RESET TX
delay_ms(5); //delay 5 ms
SpiTxReg(0x07,0x00,0x00); //TX completed, enter the Idle Mode
delay_ms(5);
}

void main(void){
init_pins(); //Microcontroller's pins init
init_TR24A();

//TX. Отправка данных
INTO_TX();
while (1){
WRITE_FIFO(0x04,0x99); //SEND 4BYTE LENGTH 0x99 0x99 0x99 0x99
}
}

 

У SPI-интерфейса передача бита со стороны мастера тактируется фронтом CLK. Здесь, похоже, сделано наоборот (см Spi_Tx_Loop). Так и надо ?

 

http://delanet.ru/images/stories/project/TR24/AN011_EM198810.pdf

chav1961. Судя по их картинке Вы правы - по фронту

А у дядьки http://delanet.ru/content/view/767/46/ китайца сделано по падению. И говорят что работает. Может, у него в схеме инвертировано?

 

Да, в двташите написано SPI_MOSI data clocked in on rising edge of SPI_CLK. Значит схемно у китайца былоа инверия

 

Вполне возможно. Попробуйте проинвертировать сигнал, может быть, все заработает

 

Не-а Не заработало Придется разбираться последовательно Загнать в эмулятор и проверить что контроллер отдает по SPI данные корректно

 


Товарищи! SPI не отвечает совсем. Смотрю MISO осцилографом и вижу фигу. Хотя уже ну разный код попробовал чтобы хоть что-то получить от модуля в ответ. В чем может быть дело?

#include <mega8.h>
#include <delay.h>

// SPI functions
#include <spi.h>
#define IN 0
#define OUT 1

// Pins definitions Îïðåäåëåíèå ïèíîâ ATMega8L - TR24A
#define nRST PORTB.1 // PB1 (OC1A) - RESET_n Ñáðîñ. Àêòèâíûé ïðè íèçêîì ñèãíàëå.
#define SS PORTB.2 // PB2 (SS) - SPI_SS Slave select input Âûáîð àêòèâíîãî óñòðîéñòâà ñ SPI (âûñîêèé - àêòèâåí?)
#define MOSI PORTB.3 // PB3 (MOSI) - SPI_MOSI Master Output Slave Input
#define MISO PORTB.4 // PB4 (MISO) - SPI_MISO Master Input Slave Out
#define CLK PORTB.5 // PB5 (SCK) - SPI_CLK SPI Clock. Òàêòèðîâàíèå îáìåíà ïî SPI
#define FIFO PORTC.5 // PC5 - FIFO_FLAG First input First out buffer full/empty
#define TXRX PORTC.4 // PC4 - PKT_FLAG Transfer/Recive packet Îòïðàêà/ïðèåì ïàêåòà
#define LED PORTD.7

// Pins init Èíèôèàëèçàöèÿ ïèíîâ
void init_pins(void){
//Î÷èñòêà ñîñòîÿíèé ïèíîâ Default pin states setting

SS = 1;

//Direction set. Óñòàíîâêà ïèíîâ
//Èçìåíèòå èìÿ ïîðòà è íîìåð ïèíà, åñëè òðåáóåòñÿ: DDRB.4 -> DDRC.3 Ïîðò B, ïèí 4 -> Ïîðò Ñ, ïèí 3
DDRB.1 = OUT; // nRST as out pin of MC ATMega8L
DDRB.2 = OUT; // SS as out pin
// DDRB.3 = OUT; // MOSI
// DDRB.4 = IN; // MISO as input
// DDRB.5 = OUT; // CLK
// DDRC.5 = IN; // FIFO
// DDRC.4 = IN; // TXRX flag
DDRD.7 = OUT;
nRST = 1;
}

void main(void){
unsigned int result;
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x2C;

SPCR=0x53;
SPSR=0x00;

init_pins();
nRST=0;
delay_ms(5);
nRST=1;
delay_ms(5);

while(1){
// if (result > 0) {LED=1; delay_ms(1000);}
// else LED=0;
//delay_ms(5);
//result = (unsigned int)
LED=0;
nRST=1;
SS = 1;
spi(0x30);
spi(0x98);
spi(0x00);

SS = 0;
spi(0x30);
spi(0x98);
spi(0x00);

delay_ms(300);

LED=1;
nRST=0;
SS = 1;
spi(0x30);
spi(0x98);
spi(0x00);

SS = 0;
spi(0x30);
spi(0x98);
spi(0x00);

delay_ms(300);
}

}

 

Схемку бы еще глянуть. Именно Вашу

 

ок
вечерком сегодня нарисую! и даже сфоткю

 

ок
вечерком сегодня нарисую! и даже сфоткю