簡體   English   中英

使用PIC18將數據保存到外部EEPROM

[英]Saving data to External EEPROM with PIC18

我有帶有25LC1024外部EEPROM的PIC18F87J11,我想在上面存儲一些數據,以后可以讀取。 我已經進行了一些研究,但不幸的是,我找不到使用與我的主板類似的教程。 我正在將MPLAB IDE與C18編譯器一起使用。

PIC18F87J11

注意:下面另寫了兩個鏈接作為注釋。

這是我的問題所在...

為了寫入25LC1024外部EEPROM,我遵循了微芯片上的教程。 第一個問題是該Tut是為PIC18F1220編寫的,而我正在使用PIC18F87J11。 因此,在打開項目時,我得到兩個文件未找到錯誤,但我只是忽略了它們。

圖片

我將文件AN1018.hAN1018_SPI.c復制到了我正在處理的項目中,並且從AN1018.c文件復制了一些代碼。

來自AN1018.c文件的代碼

void main(void)
{
#define PAGESIZE    16  
static unsigned char data[PAGESIZE];        // One-page data array
static unsigned char i;

    init();                                     // Initialize PIC

    data[0] = 0xCC;                             // Initialize first data byte

    /* Low-density byte function calls */
    LowDensByteWrite(data[0], 0x133);           // Write 1 byte of data at 0x133
    data[0] = 0xFF;
    LowDensByteRead(data, 0x133);      
    printf("%x",data);
    while(1){};  
}
void init(void)
{
    ADCON1 = 0x7F;                      // Configure digital I/O
    PORTA = 0x08;                       // Set CS high (inactive)
    TRISA = 0b11110111;                 // Configure PORTA I/O
    PORTB = 0;                          // Clear all PORTB pins
    TRISB = 0b11111100;                 // Configure PORTB I/O
}

我的第二個問題是輸出消息始終為1e0 換句話說,我不知道寫入是否成功。 我也不知道我可能會缺少什么。

如果可以得到某種幫助,我將不勝感激。 總結起來,我想將數據存儲到我的外部EEPROM中,並在需要時保留它們。 請知道我是微控制器編程的初學者。

第一步(讀取和寫入之前),必須確保正確配置了SPI接口(硬件和軟件)。 要檢查此步驟,您可以從25LC1024中讀取“狀態寄存器”。 在數據表中查找“ RDSR”,發送給eeprom的指令應為0b00000101 so(int)5。

這是一個非常老的項目的sdcc中18F * + 25LC *的代碼。 該代碼非常基礎,無需使用任何外部庫,您只需要為圖片替換寄存器變量名稱和init config。

感謝bitberzerkir ,一些代碼來自這里

spi.c

#ifndef SPI_HH
#define SPI_HH

#define SpiWrite(x) spiRW(x)
#define SpiRead()   spiRW(0)

unsigned char spiRW(unsigned char data_){
    SSPBUF = data_;
    while(!PIR1bits.SSPIF);
    PIR1bits.SSPIF = 0;
    return SSPBUF;
}

void SpiInit() {
    SSPSTAT = 0x40; // 01000000
    SSPCON1 = 0x20; // 00100000
    PIR1bits.SSPIF = 0;
}

#endif

eeprom.c

注意:由於25LC1024的地址是3x8位,因此請確保您的編譯器“長”類型至少具有24位

#ifndef EEPROM_HH
#define EEPROM_HH

#include "spi.c"

#define CS PORTCbits.RC2

void EepromInit() {
    SpiInit();
    CS = 1;
}

unsigned char EReadStatus () {
    unsigned char c;
    CS = 0;
    SpiWrite(0x05);
    c = SpiRead();
    CS = 1;
    return c;
}

unsigned char EWriting() {
    unsigned char c;
    CS = 0;
    SpiWrite(0x05);
    c = SpiRead();
    CS = 1;
    return c & 1;
}

unsigned char EReadCh (unsigned long addr) {
    unsigned char c;
    // Send READ command and addr, then read data
    CS = 0;
    SpiWrite(0x03);
    // Address in 3x8 bit mode for 25lc1024
    SpiWrite(addr>>16);
    SpiWrite(addr>>8);
    SpiWrite((unsigned char) addr);
    c = SpiRead();
    CS = 1;
    return c;
}

void EWriteCh (unsigned char c, unsigned long addr) {
    // Enable Write Latch
    CS = 0;
    SpiWrite(0x06);
    CS = 1;

    // Send WRITE command, addr and data
    CS = 0;
    SpiWrite(0x02);
    SpiWrite(addr>>16);
    SpiWrite(addr>>8);
    SpiWrite((unsigned char) addr);
    SpiWrite(c);
    CS = 1;
}

#endif

main.c中

根據數據表設置您的初始化

#include <pic18fregs.h>
#include "eeprom.c"

void main(void) {
    char out;
    TRISB = 0x01;
    TRISC = 0x00;
    PORTB = 0x00;
    PORTC = 0x00;
    EepromInit();

    EWriteCh('a', 0x00);    

    out = EReadCh(0x00);

    while(1);
}

如果要讀/寫緩沖區,請注意分頁。 例如:

// Page byte size, 64 for 25lc256 and 256 for 25lc1024
#define PSIZE 256
// Addr mem limit 7FFF for 25lc256, 1FFFF for 25lc1024
#define MLIMIT 0x1FFFF


void EReadBuff (unsigned char c[], unsigned long dim, unsigned long addr) {
    unsigned int i;
    // Send READ command and addr, then read data
    CS = 0;
    SpiWrite(0x03);
    SpiWrite(addr>>16);
    SpiWrite(addr>>8);
    SpiWrite((unsigned char) addr);
    for(i = 0; i < dim; ++i)
        c[i] = SpiRead();
    CS = 1;
}

void EWriteBuff (unsigned char c[], unsigned long dim, unsigned long addr) {
    unsigned char i;
    unsigned int begin = 0;
    unsigned int end = dim > PSIZE ? PSIZE : dim;
    while (end > begin && addr + end <= MLIMIT) {  // check if addr is a siutable address [0, MLIMIT]
        // Enable Write Latch
        CS = 0;
        SpiWrite(0x06);
        CS = 1;

        // Send WRITE command, addr and data
        CS = 0;
        SpiWrite(0x02);
        SpiWrite(addr>>8);
        SpiWrite((unsigned char) addr);
        for(i = begin; i < end; ++i)
            SpiWrite(c[i]);
        CS = 1;
        while(EWriting());
        dim -= PSIZE;
        begin += PSIZE;
        addr += PSIZE;
        end = begin + (dim > PSIZE ? PSIZE : dim);
    }
}

#endif

我認為在直接使用AN1018.h / AN1018_spi.c之前,您需要驗證它是否與您的微控制器兼容。 我建議檢查兩個微控制器的數據表,並查看專用於SPI模塊的差異,因為您使用的外部EEPROM將連接到SPI總線。 如果這兩個微控制器具有相同的SPI寄存器配置/模塊,則可以使用它,否則您將必須自己編寫驅動程序。 您可以使用AN1018_spi.c作為參考,我想您只需要更改一些寄存器即可。 然后,在您的init函數中,您沒有初始化SPI模塊,您將需要根據外部設備指定正確的SPI時鍾,SPI模式。 正確初始化SPI模塊后。 您將需要編寫EEPROM_Read / EEPROM_Write函數。 在其中,您將必須遵循外部設備的數據表中給出的協議,才能從使用設備發送/接收數據。

您好,我用Google搜索並獲得了一個很好的網站,在那里我找到了通過FM24C64通過i2c協議將外部EEPROM與PIC微控制器接口的文章,以及他們在文章中給出的經過我測試和正常工作的代碼。 我給那個鏈接可能對您有幫助。 http://www.nbcafe.in/interfacing-external-eeprom-with-pic-microcontroller/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM