/*
* Julien VILLEMEJANE - LEnsE - IOGS/ Modifié par Laurence VUGHT Kassandra GROUX, Romain MEUNIER et Lauren GUILLEMOT
*
* Bibliotheque de fonctions pour la SRAM MCP 23LCV1024 - SPI - 1Mbits
* Testée sur PIC16F1509
* version 1.1 - 2016-15-01
*
* A inclure dans les projets
* #include "sram_MCP.h"
* Nécessite la bibliotheque spi.h / spi.c
*/
#include <xc.h>
#include "../headers/config.h"
#include "../headers/spi.h"
#include "../headers/sram_MCP.h"
/*
* Initialisation de la RAM
* En mode BYTE
*/
void initRAM(void) {
// CS RAM
TRISCbits.TRISC3 = 0;
CS_RAM = 1;
__delay_ms(10);
// Reinitialisation de la SRAM
CS_RAM = 0;
__delay_ms(1);
sendSPI(RSTIO);
__delay_ms(1);
CS_RAM = 1;
__delay_ms(10);
// Envoi de la commande d'ecriture du registre de mode avec mode BYTE
CS_RAM = 0;
__delay_ms(1);
sendSPI(WRMR_RAM);
sendSPI(BYTE_MODE);
__delay_ms(1);
CS_RAM = 1;
__delay_ms(10);
//sendSPI(EDIO);
return;
}
/*
* Changement de mode de fonctionnement
* entrees :
* mode : mode de fonctionnement - PAGE_MODE, BYTE_MODE ou SEQ_MODE
*/
void changeModeRAM(char mode){
// Envoi de la commande d'ecriture du registre de mode avec mode BYTE
CS_RAM = 0;
__delay_ms(1);
sendSPI(WRMR_RAM);
sendSPI(mode);
__delay_ms(1);
CS_RAM = 1;
__delay_ms(10);
return;
}
/*
* Ecriture d'un octet à l'adresse passee en argument
* entrees :
* val : valeur à stocker
* adH : poids forts de l'adresse (sur 1 bit)
* adC : poids centraux de l'adresse (sur 1 octet)
* adL : poids faibles de l'adresse (sur 1 octet)
*
* adresse sur 17 bits : 128 kio
*/
void writeRAM(char val, char adH, char adC, char adL){
CS_RAM = 0;
sendSPI(WRITE_RAM);
sendSPI(adH);
sendSPI(adC);
sendSPI(adL);
sendSPI(val);
CS_RAM = 1;
return;
}
/*
* Ecriture d'un tableau de taille octets dont la première case est à l'adresse passée en argument
* Entrées:
* *tab : tableau à stocker
* taille: taille du tableau à stocker
* adH: poids forts de l'adresse de la première case (sur 1 bit)
* adC: poids centraux de l'adresse de la première case (sur 1 octet)
* adL: poids faibles de l'adresse de la première case (sur un octet)
* Sortie: long int i: en cas de problème pour savoir où s'est arrêtée l'incrémentation
*/
long write_tab_RAM(char *tab, long unsigned taille, unsigned char adH,unsigned char adC,unsigned char adL){
long i = 0;
while(adH<2 && i < taille ){
CS_RAM = 0;
sendSPI(WRITE_RAM);
sendSPI(adH);
sendSPI(adC);
sendSPI(adL);
sendSPI(tab[i]);
if(adL == 255)
{ if(adC == 255)
adH = (adH+1)%2;
adC++;
}
adL++;
i++;
CS_RAM = 1;
}
return i;
}
/*
* Lecture d'un octet à l'adresse passee en argument
* entrees :
* adH : poids forts de l'adresse (sur 1 bit)
* adC : poids centraux de l'adresse (sur 1 octet)
* adL : poids faibles de l'adresse (sur 1 octet)
* sortie :
* octet recupere
*
* adresse sur 17 bits : 128 kio
*/
char readRAM(char adH, char adC, char adL){
char read_data = 0;
//sendSPI(EDIO);
CS_RAM = 0;
sendSPI(READ_RAM);
sendSPI(adH);
sendSPI(adC);
sendSPI(adL);
sendSPI(0x00);
while(PIR1bits.SSP1IF == 0);
read_data = SSPBUF;
CS_RAM = 1;
return read_data;
}
/*
* Lecture d'un tableau dont on passe l'adresse de la première case en argument:
* Entrées:
* *tab: tableau de char dans lequel on stocke le tableau à lire
* taille: taille du tableau
* adH : poids forts de l'adresse (sur 1 bit)
* adC : poids centraux de l'adresse (sur 1 octet)
* adL : poids faibles de l'adresse (sur 1 octet)
* sortie :
* long int i: sert à savoir jusqu'où a été l'incrémentation
*/
long read_tab_RAM(char *tab, long taille, char adH, char adC, char adL){
long i =0;
while(adH<2 && i < taille ){
CS_RAM = 0;
sendSPI(READ_RAM);
sendSPI(adH);
sendSPI(adC);
sendSPI(adL);
sendSPI(0x00);
while(PIR1bits.SSP1IF == 0);
tab[i] = SSPBUF;
if(adL == 255)
{ if(adC == 255)
adH = (adH+1)%2;
adC++;
}
adL++;
i++;
CS_RAM = 1;
}
return i;
}