Buenas, les dejo el primer intento de programa. todavía no lo he probado en el hardware
/*
Transmisor FSK con MAX7057
La idea es generar un programa que fije la frecuencia de transmisión
En principio la frecuencia es fija y se cambiaría reeditando el código fuente y volviendo a programar el arduino
Basicamente hago una funcion que sea la que programe los registros, la salida de datos es tipo SPI (hago un SPI manual)
última edicion: 05/11/2024
*/
int spi_clk = 5;
int spi_data = 6;
int spi_enable = 7;
float freq = 433000; //Frecuencia central de transmisión en kHz
float deviation = 10; // desviación en khz (desviación total es 2 veces este valor)
float fhi = freq + deviation; //Frecuencia superior en kHz
float flo = freq - deviation; //Frecuencia inferior en kHz
float fxtal= 16000; //Frecuencia del xtal en kHz
unsigned int fhi_float;
unsigned int flo_float;
unsigned int fhi_reg;
unsigned int flo_reg;
byte fhi_reg_msb;
byte fhi_reg_lsb;
byte flo_reg_msb;
byte flo_reg_lsb;
byte CTRL_REG = 0b00000111; //el registro de control asigno los valores manualmente en esta variable
byte CFG_REG = 0b00000000; //el registro de configuracion asigno los valores manualmente en esta variable
byte ADDRESS = 0x00;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(spi_data, OUTPUT);
pinMode(spi_clk, OUTPUT);
pinMode(spi_enable, OUTPUT);
digitalWrite(spi_enable, 1);
digitalWrite(spi_data, 0);
digitalWrite(spi_clk, 0);
Serial.begin(9600); // open the serial port at 9600 bps:
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
// aca lo del led que parpadea es para ver que ande y no se tilde ////////
//////// Cálculo de los valores a programar en los registros de frecuencia ///////////////////////////
fhi_float = ((fhi/fxtal)-16)*4096;
fhi_reg = round(fhi_float);
fhi_reg_lsb = fhi_reg & 0xFF;
fhi_reg_msb = (fhi_reg >> 8) & 0xFF;
flo_float = ((flo/fxtal)-16)*4096;
flo_reg = round(flo_float);
flo_reg_lsb = flo_reg & 0xFF;
flo_reg_msb = (flo_reg >> 8) & 0xFF;
programar_registro(0x00, CTRL_REG); // programo el registro de control en la dirección 0x00 (en el comentario final estan los bit de control)
programar_registro(0x01, CFG_REG); // programo el registro de configuración en la dirección 0x01 (en el comentario final estan los bit de configuracion)
programar_registro(0x07, 0x00); // programo el resitro DATAIN con 0 de acuerdo a la hoja de datos
programar_registro(0x08, 0x00); // programo el resitro EN con 0 de acuerdo a la hoja de datos
programar_registro(0x09, 0b00000010); // programo el resitro CONFIG1 con 010 para clockout
programar_registro(0x02, fhi_reg_msb); // programo el registro HIFREQ1
programar_registro(0x03, fhi_reg_lsb); // programo el registro HIFREQ0
programar_registro(0x04, flo_reg_msb); // programo el registro LOFREQ1
programar_registro(0x05, flo_reg_lsb); // programo el registro LOFREQ0
}
//-------------------------------------------------------------------------------------------------//
//////////// Programacion registro <DATA D0 D1 … D7> //////////
void programar_registro(byte REG_NAME, byte DATA){
byte WCD = 0x01; // write command
bool r;
digitalWrite(spi_enable, 0); //Habilito el enable para transferir datos al registro
for (int a=8; a>=1; a–) //Envia el comando de escritura 0x01
{
r = bitRead(WCD, (a-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
for (int b=8; b>=1; b–) //Envia la direccion del registro a programar
{
r = bitRead(REG_NAME, (b-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
for (int i=8; i>=1; i–) //envia los datos a programar en el registro
{
r = bitRead(DATA, (i-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
digitalWrite(spi_enable, 1); //Desabilito la transferencia de datos al registro
}
/* Direcciones de los registros
- ADDRESS:
- 0x00 Registro CONTROL (Control register. Controls the mode (ASK/FSK), crystal clock output, envelope-shaping, PLL bandwidth, and SPI enable.)
- 0x01 Registro CONFIG0 (Configuration 0 register. Controls the capacitance at the PA output and clock output frequency divider)
- 0x02 Registro HIFREQ1 (High-frequency 1 register (upper byte). Sets the high frequency in FSK transmission)
- 0x03 Registro HIFREQ0 (High-frequency 0 register (lower byte). Sets the high frequency in FSK transmission)
- 0x04 Registro LOFREQ1 (Low-frequency 1 register (upper byte). Sets the low frequency in FSK transmission, or carrier frequency in ASK transmission)
- 0x05 Registro LOFREQ0 (Low-frequency 0 register (lower byte). Sets the low frequency in FSK transmission, or carrier frequency in ASK transmission.)
- 0x06 Registro FLOAD (Frequency load register. Performs the frequency load function.)
- 0x07 Registro DATAIN (Data in register. SPI equivalent of DIN pin.)
- 0x08 Registro EN (Enable register. SPI equivalent of ENABLE pin.)
- 0x09 Registro CONFIG1 (Configuration 1 register. GPO selector.)
- 0x0C Registro STATUS (Status register)
*/
/*
- Control Register (Address: 0x00)
- BIT 0: ASK(0) or FSK(1)
- BIT 1: Crystal clock output enable(1) on GPO output
- BIT 2: Crystal clock output enable(1) while part is in shutdown mode
- BIT 3: Disable(0) or enable(1) transmitter envelope-shaping resistor
- BIT 4: PLL bandwidth setting, low(0) = 300kHz or high(1) = 600kHz; 300kHz is recommended for fractional-N and 600kHz for fixed-N
- BIT 5: Enable(0) or disable(1) SPI communication during shutdow
- BIT 6: 0
- BIT 7: 0
*/
// CTRL_REG = 0b00000111;
/*
- Configuration 0 Register (Address: 0x01
*BIT 4-0: cap[4:0] 5-bit capacitor setting
*BIT 7-5 ckdiv[2:0] 3-bit clock output frequency divider
*/
//CFG_REG = 0b00000000
/*
- High-Frequency 1 Register (Address: 0x02)
- 7-0 fhi[15:8] 8-bit upper byte of high-frequency divider for FSK
/
/
*High-Frequency 0 Register (Address: 0x03)
*7-0 fhi[7:0] 8-bit lower byte of high-frequency divider for FSK
*/