代码:
C256.H
/*
* File: C256.h
* Author: Administrator
*
* Created on May 31, 2024, 2:18 PM
*/
#ifndef __C256_H__
#define __C256_H__
void delay(unsigned int x);
void InitNVM(void);
unsigned int iReadNVM(int address);
void iWriteNVM(int address,int data);
#endif /* C256_H */
NVM.C
#include<xc.h>
#include "C256.H"
#define CSEE _RD12
#define TCSEE _TRISD12
#define SPI_MASTER 0X0122
#define SPI_ENABLE 0X8000
#define SEE_WRSR 1
#define SEE_WRITE 2
#define SEE_READ 3
#define SEE_WDI 4
#define SEE_STAT 5
#define SEE_WEN 6
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++);
}
void InitNVM(void)
{
TCSEE=0;
CSEE=1;
SPI2CON1=SPI_MASTER;
SPI2STAT=SPI_ENABLE;
}
int writeSPI2(int data)
{
SPI2BUF=data;
while(!SPI2STATbits.SPIRBF);
return SPI2BUF;
}
int ReadSR(void)
{
int i;
CSEE=0;
writeSPI2(SEE_STAT);
i=writeSPI2(0);
CSEE=1;
return i;
}
unsigned int iReadNVM(int address)
{
unsigned int lsb,msb;
while(ReadSR()&0X03);
CSEE=0;
writeSPI2(SEE_READ);
writeSPI2(address>>8);
writeSPI2(address&0xfe);
msb=writeSPI2(0);
lsb=writeSPI2(0);
CSEE=1;
return(lsb);
}
void WriteEnable(void)
{
CSEE=0;
writeSPI2(SEE_WEN);
CSEE=1;
}
void iWriteNVM(int address,int data)
{
//int lsb,msb;
while(ReadSR()&0X03);
WriteEnable();
CSEE=0;
writeSPI2(SEE_WRITE);
writeSPI2(address>>8);
writeSPI2(address&0xfe);
writeSPI2(data>>8);
writeSPI2(data&0xff);
CSEE=1;
}
主程序:
/*
* File: newmain.c
* Author: Administrator
*
* Created on May 29, 2024, 3:29 PM
*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include "C256.H"
#pragma config POSCMOD= XT
#pragma config OSCIOFNC= OFF
#pragma config FCKSM= CSDCMD
#pragma config FNOSC= FRCDIV
#pragma config IESO= ON
#pragma config WDTPS= PS32768
#pragma config FWPSA= PR128
#pragma config WINDIS= OFF
#pragma config FWDTEN= ON
#pragma config ICS= PGx2
#pragma config GWRP= OFF
#pragma config GCP= OFF
#pragma config JTAGEN= OFF
/*
*
*/
void main(void)
{
//TRISDbits.TRISD12=0;
//int data;
TRISB=0;
InitNVM();
// flag=0;
iWriteNVM(0X1234,0x55aa);
delay(200);
iWriteNVM(0X0034,0xaa55);
delay(200);
iWriteNVM(0X0004,0x5a5a);
delay(200);
PORTB=iReadNVM(0X1234);
while(1)
{
}
}
仿真效果图: