gpt4 book ai didi

c - 使用 PIC18 将数据保存到外部 EEPROM

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:30 24 4
gpt4 key购买 nike

我有带 25LC1024 外部 EEPROM 的 PIC18F87J11,我想在上面存储一些数据,以便稍后读取。我做了一些研究,但不幸的是我找不到使用与我类似的板的教程。我正在使用带有 C18 编译器的 MPLAB IDE。

PIC18F87J11

注意:另外两个链接写在下面的评论中。

这就是我的问题所在......

为了写入 25LC1024 外部 EEPROM,我遵循了 Microchip 的教程。第一个问题是这个 tut 是为 PIC18F1220 编写的,而我使用的是 PIC18F87J11。因此,在打开项目时,我收到两个找不到文件错误,但我只是忽略了它们。

PICTURE

我将文件 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 中并在需要时保留它。请知道我是微 Controller 编程的初学者。

最佳答案

作为第一步(在读写之前),您必须确保您的 SPI 接口(interface)(硬件和软件)配置正确。要检查此步骤,您可以从 25LC1024 读取“状态寄存器”。查看“RDSR”的数据表,发送到 eeprom 的指令应该是 0b00000101,所以 (int)5。

这里有一些 18F* + 25LC* 的代码,写在一个非常古老的项目的 sdcc 中。代码非常基础,没有使用外部库,你只需要为你的图片替换寄存器变量名和初始化配置。

一些代码来自here , 感谢 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 位,请确保您的编译器“long”类型至少有 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

ma​​in.c

根据数据表设置你的init

#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

关于c - 使用 PIC18 将数据保存到外部 EEPROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16783324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com