当前位置:文档之家› SPI通信

SPI通信

SPI通信程序
//這是主机C8051F005有硬件SPI的AT45DB041B的讀寫驅動
// SPI Configuration
//SPI0CN = 0x02; // SPI Control Register
//MSTEN = 1; // SPI 以主方式工作
//SPI0CFG = 0xC7; // SPI Configuration Register 第二邊沿采樣,SCK空閑高
//SPI0CKR = 0x00; // SPI Clock Rate Register
SPIclk=24.5M/2
//SPIEN = 1; // SPI0CN |= 0x01;
sbit FLASH_CS = P3^6;
union long_union
{ //長整形聯合
unsigned long dat;
unsigned int word[2];
unsigned char byte[4];
}opcode;
//緩沖區1單字節寫cmd=0x84
void buff1_wr(unsigned int bfaddr,unsigned char dat) {
unsigned char i;
opcode.byte[0]=0x84;
opcode.word[1]=bfaddr;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++)
{
SPI0DAT=opcode.byte[i];
while(!SPIF);
SPIF=0;} //連續發送4個opcode
SPI0DAT=dat;
while(!SPIF);
SPIF=0; //發送第5個字節(數据)
FLASH_CS=1;
}
//緩沖區1單字節讀cmd=0xd4
unsigned char buff1_rd(unsigned int bfaddr)
{
unsigned char i;
opcode.byte[0]=0xd4;
opcode.word[1]=bfaddr;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++)
{SPI0DAT=opcode.byte[i];
while(!SPIF); SPIF=0;
} //連續發送4個opcode
SPI0DAT=0;
while(!SPIF);
SPIF=0; //發送第5個任意數据字節
i=SPI0DAT; //清空讀緩沖器
SPI0DAT=0;
while(!SPIF);
SPIF=0; //啟動一個字節傳輸
i=SPI0DAT; //讀緩沖器
FLASH_CS=1;
return(i);
}
//Main Menory Page Program through Buffer 1 or 2
//Completes writing into selected buffer. Start self-timed erase/program operation
void page_wr(unsigned char buff_num, unsigned int bfaddr, unsigned int paddr, unsigned char *datptr, unsigned int len)
{
unsigned char i;
opcode.dat=paddr; opcode.dat<<=9; opcode.dat+=(bfaddr&0x1ff); //組合opcode
opcode.byte[0]=0x82+(buff_num-1)*3; //0x82 or 0x85
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++)
{
SPI0DAT=opcode.byte[i];
while(!SPIF); SPIF=0;
} //連續發送4個opcode
for(;len>0;len--)
{
SPI0DAT=*datptr++;
while(!SPIF); SPIF=0;
} //連續發送len個指定數据
FLASH_CS=1;
//Completes writing into selected buffer. Start self-timed erase/program operation
}
//Continuous Array Read (opcode: 0xe8)
//可從主存儲區任意地址跨頁連續讀取
void array_rd(unsigned long addr, unsigned int len, unsigned char *datptr) {
unsigned char i;
unsigned int paddr, baddr;
paddr=addr / 264;
baddr=addr % 264;
opcode.dat=paddr;
opcode.dat<<=9;
opcode.dat+=baddr; //組合opcode
opcode.byte[0]=0xe8;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++)
{
SPI0DAT=opcode.byte[i];
while(!SPIF); SPIF=0;
} //連續發送4個opcode
for(i=0;i<4;i++)
{
SPI0DAT=0;
while(!SPIF);
SPIF=0;
} //連續發送4個不關心字節i=SPI0DAT; //清空讀緩沖器
for(;len>0;len--)
{
SPI0DAT=0;
while(!SPIF);
SPIF=0; //啟動一個字節傳輸*datptr=SPI0DAT; //讀緩沖器
datptr++;
}
FLASH_CS=1;
}。

相关主题