Всем привет
Уже третий день пытаюсь подружить 2 модуля, но почему-то не выходит
Итак:
Модуль RFM22b - S rev 3.0 433Мгц
Питание 3.3 вольта через дроссель с конденсаторами, все как положено
МК PIC18F25K80
Частота SPI 1.25Мгц
Регистры пишутся, читаются, с этим вопросов нет
При подаче питания читаю регистры 0x00 и 0x01
Затем прицепом вкатываю конфигурацию:
Код
SpiWrite(0x05,0x0F); // External interrupt, Packet Send interrupt, Packen receive interrupt, CRC Error interrupt
SpiWrite(0x06,0x50); // Enable Valid Preamble Detected, Enable RSSI Interrupt
SpiWrite(0x07,0x01); // Ready mode XTON = 1
SpiWrite(0x09,0x7F); // Load capacitor 12.5 pf
SpiWrite(0x0a,0x02); // GPIO2 -> 2MHz выход
SpiWrite(0x0b,0x12); // GPIO0 -> TX State на управление коммутатором антенны
SpiWrite(0x0c,0x15); // GPIO1 -> RX State на управление коммутатором антенны
SpiWrite(0x0d,0x00); // GPIO2 -> 2MHz выход
SpiWrite(0x0e,0x00); // Порты выхода в нули...и так по дефолту после сброса
SpiWrite(0x0f,0x70); // ADC - off
SpiWrite(0x10,0x00); // ADC - off
SpiWrite(0x12,0x20); // no temperature sensor used
SpiWrite(0x13,0x00); // no temperature sensor used
SpiWrite(0x1c,0x27); // 7.4 kbps, Dev: 8,750kHz
SpiWrite(0x1d,0x40); // AFC on для выключения пишем - 0x40
SpiWrite(0x1e,0x0a); // AFC timing по умолчанию как в даташите
//-------------------C этим надо бы разобраться------------------------
SpiWrite(0x20,0x87); // clock recovery **********
SpiWrite(0x21,0x00); // clock recovery **********
SpiWrite(0x22,0xF2); // clock recovery **********
SpiWrite(0x23,0x7C); // clock recovery **********
SpiWrite(0x24,0x01); // clock recovery **********
SpiWrite(0x25,0x9D); // clock recovery **********
//----------------------------------------------------------------------
SpiWrite(0x2A,0x1D); // AFC limiter
SpiWrite(0x2C,0x28 );
SpiWrite(0x2D,0xA8 );
SpiWrite(0x2E,0x28 );
SpiWrite(0x30,0xAC); // data acess control: MSB, CRC=1, CRC over data only = 0, crc type = CCITT)
SpiWrite(0x32,0x00); // broadcast = disable
SpiWrite(0x33,0x10); //
//-----------------------------------------------------------------------
SpiWrite(0x34,0x04); // preamble = 16bits
SpiWrite(0x35,0x22); // preamble detect = 16bit, rssi_offset = 0
SpiWrite(0x36,0x2D); // preamble 1
SpiWrite(0x37,0xD4); // preamble 2
SpiWrite(0x38,0x00); // preamble 3
SpiWrite(0x39,0x00); // preamble 4
//-----------------------------------------------------------------------
SpiWrite(0x3a,0xFF); // tx header 3
SpiWrite(0x3b,0x00); // tx header 2
SpiWrite(0x3c,0x00); // tx header 1
SpiWrite(0x3d,0x00); // tx header 0
SpiWrite(0x3e,0x00); // pkt len = 0, not used
SpiWrite(0x3f,0xFF); // rx header 3
SpiWrite(0x40,0x00); // rx header 2
SpiWrite(0x41,0x00); // rx header 1
SpiWrite(0x42,0x00); // rx header 0
//-----------------------------------------------------------------------
SpiWrite(0x43,0xFF); // header 3 check mask
SpiWrite(0x44,0xFF); // header 2 check mask
SpiWrite(0x45,0xFF); // header 1 check mask
SpiWrite(0x46,0xFF); // header 0 check mask
//-----------------------------------------------------------------------
SpiWrite(0x69,0x60); // Automatic Gain Control Enable for preamble time
//-----------------------------------------------------------------------
SpiWrite(0x6d,0x03); // transmit power
SpiWrite(0x6E,0x3C); // tx data rate 1 7400
SpiWrite(0x6f,0x9F); // tx data rate 2, всего получится 7.4 кбит/с если пересчитать по формуле
SpiWrite(0x70,0x2C); // no Manchester Coding, no Data Whitening, txdtrtscale = 1 for < 30 kbps
//SpiWrite(0x71,0xA0); // direct mode... для теста спектроанализатора...
SpiWrite(0x71,0x23); // No TX Data CLK is available, FIFO Mode, GFSK
SpiWrite(0x72,0x0E); // deviation 8.750kHz
SpiWrite(0x73,0x53); // frequency offset = 0
SpiWrite(0x74,0x00); // frequency offset = 0
//-----------------------------------------------------------------------------------
SpiWrite(0x75,0x53); // band selction: 430 - 439.9 MHz
SpiWrite(0x76,0x00); // carrier freq // расчетное по формуле 430,000 Мгц
SpiWrite(0x77,0x00); // carrier freq
SpiWrite(0x79,0x00); // req channel = 0. by default
SpiWrite(0x7a,0x01); // NO!!! freq hopping size = 10 kHz
На комменты внимания особо не обращайте они могут не соответствовать действительности...эксперименты...
Далее Передача байта:
Просто инкрементирем байт и пишем его в передающий ФИФО...
Код
SpiWrite(0x79, 20); // Установка частоты передачи
while (1) {
RFM22ResetTxFifo(); // Reset FIFO pointer
SpiWrite(0x7F,a++); // Запись байта
SpiWrite(0x07,0x09); // Передача...
while(RFM22_NIRQ){} // Ждем пока передаст
// читаем прерывания...
char temp = SpiRead(0x03);
temp = SpiRead(0x04);
}
Прием байта...
Код
SpiWrite(0x79, 20); // Установили частоту приема
while (1) {
SpiWrite(0x07,0x05); // прием...
while(RFM22_NIRQ){} //Ждем пока что нибудь примем...
RFM22ResetRxFifo(); // Сбросили указатели приемного ФИФО
temp1 = SpiRead(0x03);
temp2 = SpiRead(0x04);
// Приняли, теперь разбираем...
//CRC Error?
if (temp1 & 0x01){LED2 = 1; UsartPrintln("CRC Error!");} else {LED2 = 0;}
//Valid Packet Received?
if (temp1 & 0x02){LED1 = 1;} else {LED1 = 0;}
// Читаем байт из приемного ФИФО и передаем его в терминал в 16ричном формате, подготовив в читабельный вид
CharToUsart(SpiRead(0x7F));
RFM22ResetRxFifo();
//Phreamble valid?
if (temp2 & 0x40){LED2 = 1;} else {LED2 = 0;}
//RSSI Ready?
if (temp2 & 0x10){UsartPrint("RSSI: ");
HexToDec(SpiRead(0x26));
UsartPrintChar(Sot+0x30);
UsartPrintChar(Des+0x30);
UsartPrintlnChar(Ed+0x30);
}
}
Если надо - фи-и сброса указателей...
Код
void RFM22ResetRxFifo(void){
unsigned char tmp;
tmp = SpiRead(0x08 );
tmp &= 0b11111101; // bit 1 = 0;
tmp |= 0b00000010; // bit 1 = 1;
SpiWrite(0x08, tmp);
tmp &= ~1;
SpiWrite(0x08, tmp);
}
void RFM22ResetTxFifo(void){
unsigned char tmp;
tmp = SpiRead(0x08 );
tmp &= 0b11111110; // bit 0 = 0;
tmp |= 0b00000001; // bit 0 = 1;
SpiWrite(0x08, tmp);
tmp &= ~2;
SpiWrite(0x08, tmp);
}
Передовать вроде передает, приеник детектит валидные пакеты, пишет RSSI, но в приемном буфере постоянно 0x42
Ставил другие модуля - та же пертрушка, только не 0х42, а 0х2С
Что я делаю не так?