Il piano originale era...usare CC1101 come su Flipper Zero con un dispositivo già pronto ma a basso costo..
La scelta e' caduta su qesto
In linea di principio doveva diventare il clone di Yard Stick One (a meno di 1/10 del prezzo) magari appoggiandosi su RFQuack o cc1101-tools
L'esecuzione e' stata pessima...ma andiamo con ordine
La scheda mi e' arrivata da Aliexpress senza uno straccio di istruzioni d'uso ed anche la pagina del venditore non mi era di aiuto. Collegando il dispositivo vedevo un convertitore seriale-TTL CP2012 ma inviando dati sulla /dev/ttyUSB0 nessuna risposta e tanto meno segni dal led integrato
Aprendo il case si vedono i chip CP2012, un ATMega48PA ed il CC1101 quindi dalla USB si invia comandi all'ATMega che li reinvia al CC1101 tramite SPI....tranne per il fatto che il microcontrollore non ha un booloader Arduino (c'e' da dire che ci sono le piazzole per saldare i connettori di MISO/MOSI e SCLK quindi non tutto e' perduto per la programmabilita')
ho trovato questo vecchio link che spiega come inviare le impostazioni di trasmissione
http://www.yesyes.info/index.php/electronics/rf1100-232-rf-433mhz-transceiver-module/
in pratica sembra che questi dispositivi non siano nati per sniffare traffico ma solo per comunicare in modo seriale..in pratica si puo' impostare il canale, la potenza e poco piu' ... niente modulazione per esempio
Frugando su GitHub ho trovato questo link
https://github.com/acontini/CC1101_USB
Avvertenza...nel rar c'e' un eseguibile windows che virustotale segnala come virus...io sono su Linux ..ci sono alcuni documenti tra cui un eseguibile in C che sembra il firmware del ATMega48PA
Nel pacchetto c'e' anche un PDF di documentazione con la mail dell'assistenza tecnica...ho provato a contattarla ma la mail e' tornata indietro...adesso il dominio sembra appartenere ad una ditta che produce occhiali (maledizione)
La scheda viene inizializzata in 9600, canale 0, massima potenza ed ID 1. Dopo di cio' c'e' un loop infinito in cui i bytes del buffer di trasmissione vengono mandati al CC1101 con un carattere di SYNC alla fine
#include <reg52.h>
#include <intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
sfr WDT_CONTR =0Xe1; //watchdog
sbit KEY1 =P3^6; //Key1 uguale al bit 6 porta 3
sbit KEY2 =P3^7;
sbit led =P2^5;
sbit led3=P2^0;
sbit led2=P2^1;
sbit led1=P2^2;
sbit led0=P2^3;
INT8U TxBuf[4];
INT8U send_f;
//when i=100. delay=1.5ms
static void delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
}
void UART_init()
{
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
TMOD = TMOD | 0x20 ; /* Timer 1 in mode 2 */
TH1 = 0xFD; /* 9600 Bds at 11.059MHz */
TL1 = 0xFD; /* 9600 Bds at 11.059MHz */
//IE =0x90;
TR1 = 1; /* Timer 1 run */
ET1 =0;
ES=1;
PS=1;
EA =1;
}
void Sendchar(unsigned char c)
{
SBUF=c;
while(TI==0);
TI=0;
}
void print_string(unsigned char* p)
{
while(*p !='\0')
{
Sendchar(*p++);
}
}
//--------------------------------------------------------------------------------------------------
// com_interrup()
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
if(RI) {
RI=0;
TxBuf[2]=SBUF;
send_f=1;
send_f=1;
led=1;
}
}
void main(void)
{
INT8U leng =0;
INT8U i,k=0;
INT8U RxBuf[4]={0};
INT8U rxcount;
INT8U TxBuf[30];
led=1;
rxcount=0xff;
TxBuf[2]=2;
TxBuf[3]=0;
UART_init();
P0=0x00;
led1=0;
for(i=0; i<30; i++)
{
TxBuf[i]=i;
}
Sendchar(0xA3); //Comandi set serial port baud rate
Sendchar(0x3A);
Sendchar(0x02); //Imposta la baudrate a 9600 (1:4800,2:9600, 3:19200)
delay(6000);
Sendchar(0xA7); //Set Channel
Sendchar(0x7A);
Sendchar(0x00); //Setta canale 0 (da 00 a 255)
delay(6000);
Sendchar(0xAB); //Set TX Power
Sendchar(0xBA);
Sendchar(0x0A); //0A :10DBM (valori permessi 00,05,07,0A)
delay(6000);
Sendchar(0xA9); //Set Module ID
Sendchar(0x9A);
Sendchar(0x00); //
Sendchar(0x01); //Due bytes : da 0 a 65535
delay(6000);
delay(6000);
// WDT_CONTR=0x3c;
while(1) //loop
{
WDT_CONTR=0x3c;
if(KEY1==0)
{
delay(10);
while(!KEY1)
{
delay(10);
}
led1=0;
print_string("abcdefghijklmnopqrstuvwxyzABCD");
led1=1;
delay(750);
for(i=0;i<23;i++)
{
Sendchar(TxBuf[i]);
}
delay(750); .
Sendchar(0x66); //carattere di SYNC
}
delay(450);
led1=1;
delay(100);
}
}
Per la configurazione vera e propria della radio ci sono indicazioni in ma non sono riuscito a trovare il modo di far passare i comandi dalla USB verso il CC1101
per esempio nella libreria si trova per cambiare il numero di canale si usa la funzione
setChannel che scrive nel registro 0x0A il valore del canale scelto
i parametri per la configurazione visti qui sono invece 0xA7
#define CC1101_CHANNR 0x0A // Channel number
void ELECHOUSE_CC1101::setChannel(byte ch){
chan = ch;
SpiWriteReg(CC1101_CHANNR, chan);
}
void ELECHOUSE_CC1101::SpiWriteReg(byte addr, byte value)
{
SpiStart();
digitalWrite(SS_PIN, LOW);
while(digitalRead(MISO_PIN));
SPI.transfer(addr);
SPI.transfer(value);
digitalWrite(SS_PIN, HIGH);
SpiEnd();
}