#include <p32xxxx.h>
#define _SUPPRESS_PLIB_WARNING // Elimina los warning de aviso de que estas librerias dejarán de estar disponible en futuras versiones.
#include <plib.h> //Librería de periféricos
#include <stdio.h>
#pragma config FNOSC = PRIPLL, POSCMOD = HS, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FPBDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FWDTEN = OFF
#define SYSCLK (72000000)
#define PBCLK (SYSCLK/2)
#define DESIRED_BAUDRATE (115200) //The desired BaudRate
// calculate actual BAUD generate value.
#define BAUD_VALUE ((PBCLK/16/DESIRED_BAUDRATE)-1)
void spi_ini(); // INICIALIZA EL MODULO SPI
void delay_ms(unsigned long); // implementa función de retardo.
void lcdprint(char texto[]); // imprime texto via puerto SPI.
int main(void)
{
unsigned char data = 0;
SYSTEMConfigPerformance(72000000L);
OpenUART2(UART_EN, UART_RX_ENABLE | UART_TX_ENABLE, BAUD_VALUE );
U2MODE = 0b00000000000000001110100000100001; // AutoBaudRate Habilitado.
spi_ini();
int a = 0;
while(a <=10) // Recibe diez caracteres y los repite ( Función Eco para probar el modulo y la comunicación UART))
{
while(!DataRdyUART2()); // Espera a que haya un caracter en el buffer de recepción.
data = (char)ReadUART2(); // lee y carga el caracter en variable.
while(BusyUART2()); /* Wait till the UART transmitter is free. */
putcUART2(data); /* Write data into Tx. */
a++;
}
lcdprint("IMPRIME ESTE TEXTO VIA SPI\0");
while(1);
return 0;
}
void spi_ini() {
unsigned int config=SPI_CON_MODE8|SPI_CON_SMP|SPI_CON_ON|SPI_OPEN_MSTEN; // SPI configuration word
SpiChnOpen(1, config, 128); // Canal SPI, configuración y velocidad (Divisor de PBCLC)
}
void delay_ms(unsigned long retardo) {
unsigned long i = 0;
for (i=0;i<=retardo;i++);
}
void lcdprint(char texto[]) { // Esta función debería terminar cuando [i] apunte al caracter NULL, pero no lo hace, simplemente no se detiene, la frase sale entera, incluido el NULL
// Pero luego sigue enviando 0xFF,0xFF sucesivamente de forma infinita,
int i;
while(texto[i] != '\0') SpiChnPutC(1,texto[i++]) ;
}
/*
void lcdprint(char texto[]) { // Esta función si que funciona perfectamente. El IF vé perfectamente el NULL y se cumple el break;
int i;
for (i=0;i<1000;i++) {
SpiChnPutC(1,texto[i++]) ;
if (texto[i] == '\0') break;
}
}
*/