Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Muy buenas,
en estos días he escrito un par de librerías para pinguino. De momento están muy verdes, pero las he probado y funcionan. La más simple es la de SPI, básicamente tiene 3 funciones:
spi_hw_init(char mode0, char mode1, char role)
Esta función configura todos los pines y establece los registros a los valores necesarios para que todo funcione. mode0 y mode1 especifican el tipo de conexión SPI (0,0 o por ejemplo 1,1). Se puede usar para mode0 HIGH o LOW y para mode1 FALLING o RISING. El tercer parámetro indica el rol que tiene el dispositivo en cuestión y puede ser cualquiera de estos: MASTER, MASTER_FOSC_4, MASTER_FOSC_16, MASTER_FOSC_64, MASTER_FOSC_T2, SLAVE_SS o SLAVE.
spi_hw_write(char c)
Esta función simplemente envía un byte por SPI y devuelve el byte leído del otro dispositivo mientras se enviaba nuestro byte.
spi_hw_read()
Permite leer un byte. Es equivalente a spi_hw_write(0x00). En el caso de un dispositivo maestro generará la señal de reloj y recibirá lo que el esclavo envíe. En caso de un dispositivo esclavo esta función se quedará a la espera de una señal de reloj para poder enviar el byte.
Adjunto también la librería de LCD pero no me da tiempo a explicarla. En el código está casi todo explicado.
Un saludo.
Bueno, en mis ratos libres voy avanzando con el tema de las librerías para pinguino. Basándome en la librería SPI estoy creando una librería para controlar las memorias SPI de microchip. De momento solo la he podido probar con la 25FC1024/25AA1024 y lo que llevo implementado funciona, aquí pongo un ejemplo de cómo quedaría para el usuario un programa normal (también usa la librería LCD):#include <lcd.c>
#include <25xx1024.c>
void setup() {
lcd_init();
flash_25xx1024_init();
}
// Cadena que vamos a grabar en la memoria y buffer donde leeremos
// posteriormente lo que hemos almacenado
const char msg[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
char msg2;
// Dirección de comienzo de escritura
long dir = 0x00000000;
void loop() {
char i;
char x=0,y=0;
// Escritura
lcd_print("Escribiendo...");
flash_25xx1024_write(dir, msg, sizeof(msg));
lcd_clear();lcd_home();
// Lectura
flash_25xx1024_read(dir, msg2, sizeof(msg));
for(i=0;i<sizeof(msg)-1;i++) {
lcd_write(msg2);
// Pongo control para no escribir fuera del display
if(x==15) {
x=0;
y=!y;
lcd_setCursor(x,y);
if(y==0)
lcd_clear();
} else {
x++;
}
delay(50);
}
while(1);
}
De momento tengo solo las funciones necesarias para leer y escribir:
void flash_25xx1024_init(void);
void flash_25xx1024_write_enable(void);
void flash_25xx1024_write(long address, char * buffer, char num);
void flash_25xx1024_write_byte(long address, char byte);
void flash_25xx1024_read(long address, char * buffer, char num);
char flash_25xx1024_read_byte(long address);
char flash_25xx1024_read_sr(void);
En estos días haré las funciones para borrar páginas, sectores y el chip completo. También pondré algunas funciones para proteger sectores y manejar el sistema de bajo consumo de la memoria.
Si hay alguna sugerencia o algún interesado que lo comente por aquí.
Un saludo.
Buenas, he añadido varias funciones más a la librería 25xx1024. De momento no voy a añadir más funciones, aunque soy consciente de que faltan las funciones para la protección de bloques de memoria.
Estas son todas las funciones que tiene ahora mismo la librería:void flash_25xx1024_init(void);
void flash_25xx1024_write_enable(void);
void flash_25xx1024_write(long address, char * buffer, char num);
void flash_25xx1024_write_byte(long address, char byte);
void flash_25xx1024_read(long address, char * buffer, char num);
char flash_25xx1024_read_byte(long address);
char flash_25xx1024_read_sr(void);
void flash_25xx1024_erase_page(int page);
void flash_25xx1024_erase_sector(char sector);
void flash_25xx1024_erase_chip(void);
void flash_25xx1024_sleep(void);
char flash_25xx1024_signature(void);
Si alguien las prueba y encuentra algún problema que me lo comente. En principio debería funcionar con todos los chips de esta familia, que son los siguientes: 25xx010, 25xx020, 25xx040, 25xx080, 25xx160, 25xx320, 25xx640, 25xx128, 25xx256, 25xx512, 25xx1024. Cualquier otro chip compatible también debería de funcionar. Agradecería que las probase alguien que tenga una memoria del mismo tipo para confirmar que funciona con estos chips.
Un saludo.