我有PIC18F87J11和25LC1024外部EEPROM,我想在其上存储一些数据,以后可以读取它。我做了一些研究,但遗憾的是我找不到像我一样使用类似电路板的教程。我正在使用带有C18编译器的MPLAB IDE。
注意:另外两个链接在下面写为评论。
这就是我的问题......
为了写入25LC1024外部EEPROM,我遵循微芯片的教程。第一个问题是这个tut是为PIC18F1220编写的,我使用的是PIC18F87J11。因此,在打开项目时,我得到两个文件未找到错误,但我只是忽略了它们。
我将文件 AN1018.h 和 AN1018_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并在需要时保留它。请知道我是微控制器编程的初学者。
答案 0 :(得分:1)
作为第一步(在阅读和写入之前),您必须确保正确配置了SPI接口(硬件和软件)。要检查此步骤,您可以从25LC1024中读取“状态寄存器”。查看“RDSR”的数据表,发送到eeprom的指令应为0b00000101 so(int)5。
这里有一些代码为18F * + 25LC *在一个非常古老的项目的sdcc中。代码非常基本,没有使用外部库,你只需要为你的pic替换寄存器变量名和init配置。
有些代码来自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的地址是3x8bits,因此请确保编译器的“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
<强>的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
答案 1 :(得分:0)
我认为在直接使用AN1018.h / AN1018_spi.c之前,您需要验证它是否与您的微控制器兼容。我建议检查两个微控制器的数据表并查看SPI模块的具体差异,因为您使用的外部EEPROM将连接到SPI总线。如果这两个微控制器具有相同的SPI寄存器配置/模块,那么您可以使用它,否则您必须自己编写驱动程序。您可以使用AN1018_spi.c作为参考我猜您只需要更改一些寄存器即可。 然后在你的init函数中,你没有初始化SPI模块,你需要根据你的外部设备指定正确的SPI时钟,SPI模式。一旦正确初始化SPI模块。您需要编写EEPROM_Read / EEPROM_Write函数。在这种情况下,您必须遵循外部设备数据表中给出的协议,以便使用设备发送/接收数据。
答案 2 :(得分:0)
嗨我用Google搜索并获得了一个非常好的网站我发现在外部EEPROM与PIC单片机接口通过i2c协议与FM24C64以及他们在帖子中给出的代码,我测试并正常工作。我给那个链接可能对你有帮助。 http://www.nbcafe.in/interfacing-external-eeprom-with-pic-microcontroller/