ATMEGA8 SPI 总线读写 93C46
扫描二维码
随时随地手机看文章
//PINassignment
#defineSSPB2//Chipselect
#defineSCKPB5//cLOCk
#defineMOSIPB3//input
#defineMISOPB4//output
#defineSS_SET(PORTB|=(1<
#defineSS_CLR(PORTB&=~(1<
voidspi_init(void)
{
DDRB|=(1<
SPCR=0x53;
SPSR=0x00;
}
voidSendByte(u8sData)
{
SPDR=sData;
while(!(SPSR&(1<<SPIF)));
}
u8spi_read(void)
{
SPDR=0x00;
while(!(SPSR&(1<
}
//////////////////////////////////////////////////
//startandstopconditionof93C46
voidStart(void)
{
u8temp;
temp=SPCR;
SPCR=0;//禁止SPI功能
//-----------------------------------------------
SCK_CLR;//手工产生一个起始位,93C46特殊的地方
MOSI_SET;//所以要特殊处理
SS_SET;
SCK_SET;
//-----------------------------------------------
SPCR=temp;//使能SPI功能
}
voidStop(void)
{
SS_CLR;
}
//////////////////////////////////////////////////
//writeenable/diable
voidEWEN(void)
{
Start();
SendByte(0x30);//EWENcommand
Stop();
}
voidEWDS(void)
{
Start();
SendByte(0x00);//EWDScommand
Stop();
}
//////////////////////////////////////////////////
//readword
u16ReadWord(u8addr)
{
u16temp=0;
u8hig,low;
Start();
SendByte(addr|0x80);//readcommand
//------------------------切换到SPI模式1
SPCR=0x5b;
hig=spi_read();
low=spi_read();
//------------------------切换回SPI模式0
SPCR=0x53;
Stop();
temp=(hig<<8)+low;
returntemp;
}
//////////////////////////////////////////////////
//writeaword
voidWriteWord(u16data,u8addr)
{
EWEN();
Start();
SendByte(addr|0x40);//writecommand
SendByte((u8)(data>>8));//sendhigbyte
SendByte((u8)data);//sendlowbyte
Stop();//waitatlease2ms
}
voidWriteAll(u16data)
{
EWEN();//writeenable
Start();
SendByte(0x10);//writecommand
SendByte((u8)(data>>8));//sendhigbyte
SendByte((u8)data);//sendlowbyte
Stop();//waitatlease10MS
}