|
按照数据手册,连续写不能跨页,页大小128,但我即使没有跨页,连续写只能是123字节以内,附文件包,请高手指教,万分感谢
点击此处下载 ourdev_512431.rar(文件大小:82K) (原文件名:spieepromZC.rar)
#include <avr\io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*******************************************************
SPI通讯程序
********************************************************
部分接口定义
***************************************************/
#define DCLK PB7 //SCK-1
#define DIN PB6 //MISO-0
#define DOUT PB5 //MOSI-1
#define CS PB4 //SS-1
#define SelectMemory1() PORTB&=~(1<<PB4)
#define DeselectMemory1() PORTB|=(1<<PB4)
#define ClrHoldMemory1() PORTB&=~(1<<PB3)
#define SetHoldMemory1() PORTB|=(1<<PB3)
#define WREN 0x06 // set write enable latch 设置写使能锁存
#define WRDI 0x04 // reset write enable latch 写使能锁存器复位
#define RDSR 0x05 // read status register 读状态寄存器
#define WRSR 0x01 // write status register 写状态寄存器
#define READ 0x03 // read data from memory array 从内存读取数据阵列
#define WRIT 0x02 // write data to memory array 数据写入存储器阵列
uchar spi_RDYCHK(void) ;
/*****************************************************
SPI初始化,接口初始化,中断初始化
******************************************************/
void spi_init(void)
{
PORTB|= (1<<CS)|(1<<DOUT)|(1<<DIN); //ss设置为输出,主动控制总线选择,从设备每台一条SS线
DDRB |= (1<<CS)|(1<<DOUT)|(1<<DCLK);//ss(低)、sck、mosi 输出方式,
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPHA); //使能spi、主机模式、高位在先、采样模式0(起始沿采样)、fosc/4
}
/****************************************************************
SPI基础函数,输出数据到MOSI,函数不具备接收方一定能接收到
******************************************************************/
void SPI_WriteByte(uchar data)
{
SPDR = data; //启动数据传输
while(!(SPSR & (1<<SPIF))); //等待传输结束
}
/****************************************************************
SPI基础函数,接收MISO的数据,函数不具备一定能接收到需要的数据
******************************************************************/
uchar SPI_ReadByte(void)
{
SPDR = 0xff;
while(!(SPSR & (1<<SPIF))); //等待接收结束
return SPDR; //返回数据
}
/****************************************************************
eeprom spi基础函数,写允许使能
******************************************************************/
void spi_WREN(void)
{
SelectMemory1(); //选中设备
SPI_WriteByte(WREN);
DeselectMemory1();
}
/****************************************************************
eeprom SPI基础函数, 读状态寄存器
******************************************************************/
uchar spi_RDSR(void)
{
uchar Temp;
SPI_WriteByte(RDSR);
Temp = SPI_ReadByte();
return Temp;
}
/****************************************************************
eepromSPI基础函数,检查RDY位,闲则返回1
******************************************************************/
uchar spi_RDYCHK(void)
{
uchar Temp;
Temp = spi_RDSR();
if (!(Temp&0x01))Temp=1;
return Temp;
}
/****************************************************************
EEPROM SPI基础函数,写状态寄存器
******************************************************************/
void spi_WRSR(uchar sdata)
{
SPI_WriteByte(WRSR);
SPI_WriteByte(sdata);
while(!spi_RDYCHK());
}
/****************************************************************
SPI基础函数,读多个字节,读取开始地址eep_ADD,共读datalenth个数据,存于pdata
******************************************************************/
void ReadBytes(uint eep_ADD,uchar* pdata,uint datalenth) //读多个字节
{
uint i;
while(!spi_RDYCHK());
SelectMemory1();
SPI_WriteByte(READ);
SPI_WriteByte(eep_ADD>>8);
SPI_WriteByte(eep_ADD);
for(i=0;i<datalenth;i++)
{
pdata = SPI_ReadByte();
}
DeselectMemory1();
}
/****************************************************************
SPI基础函数,写adrr开始5个字节
******************************************************************/
void Writebyte(uint adrr,uchar *pdata) //写多个字节
{
uchar i;
spi_WREN();
SelectMemory1();
SPI_WriteByte(WRIT);
SPI_WriteByte(adrr>>8);
SPI_WriteByte(adrr);
for (i=0;i<5;i++)
{
SPI_WriteByte(pdata);
}
while(!spi_RDYCHK());
SPI_WriteByte(WRDI);
while(!spi_RDYCHK());
DeselectMemory1();
}
/****************************************************************
SPI基础函数,页写(25AA512一页128字节)写开始地址page,被写数据存于pdata
******************************************************************/
void Writeend(uint page,uchar *pdata) //写多个字节
{
uchar i,ptr[5];
uint eep_ADD;
eep_ADD=128*page;
spi_WREN();
SelectMemory1();
SPI_WriteByte(WRIT);
SPI_WriteByte(eep_ADD>>8);
SPI_WriteByte(eep_ADD);
for (i=0;i<128;i++)
{
SPI_WriteByte(pdata);
}
while(!spi_RDYCHK());
SPI_WriteByte(WRDI);
while(!spi_RDYCHK());
DeselectMemory1();
}
/****************************************************************
主函数
******************************************************************/
int main(void)
{
uint i;
uchar rbuf[256],wbuf[256];
DDRA=0XFF;
PORTA=0X00;
spi_init();
for(i=0;i<256;i++)
{
wbuf=i+1;
}
while(1)
{
Writeend(0,wbuf);
//Writebyte(123,wbuf);
_delay_ms(100);
// Writeend(1,wbuf);
//Writebyte(123,wbuf);
// _delay_ms(100);
ReadBytes(0, rbuf,124);
for(i=0;i<124;i++)
{
PORTA=rbuf;_delay_ms(200);
}
/*Writezpage(0,wbuf); //写多个字节
_delay_ms(100);
ReadBytes(0, rbuf,64);
for(i=0;i<64;i++)
{
PORTA=rbuf;_delay_ms(200);
}*/
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|