top of page

/*
 * 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;
}
 

bottom of page