📄 spi.c
字号:
/**************************************
File : SPI.C
Project : BDTRV20_MCU_V07
Description :
Created : 2004
Last updata : 2004
Author : wangwenyu
Compile Tool : Keil
Target Device : SST89V564RD
Circuit Board : 7700
************************************
Modification History
************************************
Version : v1.4
Date : MM/DD/YYYY
Modifier :
Description :
**********************************
-- Copyright (c)
*************************************/
#include <SST89V564.H>
sbit WSCK = 0x97; //P17
sbit WSI = 0x95; //P15
sbit WSO = 0x96; //P16
sbit WCS = 0x91; //P11
sbit AD7 = ACC^7;
sbit AD6 = ACC^6;
sbit AD5 = ACC^5;
sbit AD4 = ACC^4;
sbit AD3 = ACC^3;
sbit AD2 = ACC^2;
sbit AD1 = ACC^1;
sbit AD0 = ACC^0;
extern wdt(void);
/*unsigned char MasterIO(unsigned char SPI_out)
{
unsigned char temp;
SPDR = SPI_out;
do {temp = SPSR & 0x80;}
while(temp != 0x80);
SPSR = 0x00;
return SPDR;
}*/
void WREN(void)//写允许
{
ACC=0x06; //Write enable instruction.
WCS=0; //Chip selected.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
WCS=1; //Disable chip select.
}
/*void WRDI(void)//写禁止
{
ACC=0x04; //Write disable instruction.
WCS=0; //Chip select.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
WCS=1; //Disable chip select.
}*/
/*
unsigned char SDSR(void)//读状态寄存器
{
ACC = 0x05; //Read Instruction 0x03.
WCS=0; //Chip select.
//Send read Instruction (0x03).
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
//Read data from X5045.
WSCK=0; //Bit 7.
AD7=WSO;
WSCK=1;
WSCK=0; //Bit 6.
AD6=WSO;
WSCK=1;
WSCK=0; //Bit 5.
AD5=WSO;
WSCK=1;
WSCK=0; //Bit 4.
AD4=WSO;
WSCK=1;
WSCK=0; //Bit 3.
AD3=WSO;
WSCK=1;
WSCK=0; //Bit 2.
AD2=WSO;
WSCK=1;
WSCK=0; //Bit 1.
AD1=WSO;
WSCK=1;
WSCK=0; //Bit 0.
AD0=WSO;
WSCK=1;
WCS=1; //Chip select disable.
return(ACC); //Return the data having read.
}
void WRSR(unsigned char byte)//写状态寄存器(看门狗和块锁定)
{
ACC=0x01; //Write instruction.
WCS=0; //Chip select.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC= byte; //Write 1st byte.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
WCS=1; //Chip unselected.
}
*/
unsigned char READ(unsigned char CMD,unsigned char addr)
{
//unsigned int j = 0x0200;
//while(j!=0){j--;}
wdt();
ACC = CMD; //Read Instruction 0x03.
WCS=0; //Chip select.
//Send read Instruction (0x03).
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC=addr;
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
//Read data from X5045.
WSCK=0; //Bit 7.
AD7=WSO;
WSCK=1;
WSCK=0; //Bit 6.
AD6=WSO;
WSCK=1;
WSCK=0; //Bit 5.
AD5=WSO;
WSCK=1;
WSCK=0; //Bit 4.
AD4=WSO;
WSCK=1;
WSCK=0; //Bit 3.
AD3=WSO;
WSCK=1;
WSCK=0; //Bit 2.
AD2=WSO;
WSCK=1;
WSCK=0; //Bit 1.
AD1=WSO;
WSCK=1;
WSCK=0; //Bit 0.
AD0=WSO;
WSCK=1;
WCS=1; //Chip select disable.
return(ACC); //Return the data having read.
}
/*void WRITE(unsigned char CMD,unsigned char addr,unsigned char byte)//向选定的开始地址单元中写入数据
{
unsigned int j = 0x0600;//5ms
//while(j!=0){j--;}
WREN();
ACC=CMD; //Write instruction.
WCS=0; //Chip select.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC=addr; //Write address.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC= byte; //Write 1st byte.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
WCS=1; //Chip unselected.
j = 0x0600;
while(j!=0){wdt();j--;}
}*/
/*
void ReadCont(unsigned char CMD,unsigned char addr,unsigned char NoBytes,unsigned char DataArray[],unsigned char ArrayStart)
{
unsigned char i;
unsigned int j = 0x0200;
while(j!=0){j--;}
ACC = CMD; //Read Instruction 0x03.
WCS=0; //Chip select.
//Send read Instruction (0x03).
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC=addr;
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
//Read data from X5045.
for (i=0;i<NoBytes;i++)
{
WSCK=0; //Bit 7.
AD7=WSO;
WSCK=1;
WSCK=0; //Bit 6.
AD6=WSO;
WSCK=1;
WSCK=0; //Bit 5.
AD5=WSO;
WSCK=1;
WSCK=0; //Bit 4.
AD4=WSO;
WSCK=1;
WSCK=0; //Bit 3.
AD3=WSO;
WSCK=1;
WSCK=0; //Bit 2.
AD2=WSO;
WSCK=1;
WSCK=0; //Bit 1.
AD1=WSO;
WSCK=1;
WSCK=0; //Bit 0.
AD0=WSO;
WSCK=1;
DataArray[i+ArrayStart] = ACC;
}
WCS=1; //Chip select disable.
}*/
void WriteCont(unsigned char CMD,unsigned char addr,unsigned char DataArray[],unsigned char offset)
{
unsigned char i;
unsigned int j = 0x0600;//5ms
//while(j!=0){j--;}
//j = 0xffff;
//while(j!=0){j--;}
WREN();
ACC=CMD; //Write instruction.
WCS=0; //Chip select.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
ACC=addr; //Write address.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
for(i=0;i<16;i++)
{
ACC=DataArray[i+offset]; //Write 1st byte.
WSCK=0; //Bit 7.
WSI=AD7;
WSCK=1;
WSCK=0; //Bit 6.
WSI=AD6;
WSCK=1;
WSCK=0; //Bit 5.
WSI=AD5;
WSCK=1;
WSCK=0; //Bit 4.
WSI=AD4;
WSCK=1;
WSCK=0; //Bit 3.
WSI=AD3;
WSCK=1;
WSCK=0; //Bit 2.
WSI=AD2;
WSCK=1;
WSCK=0; //Bit 1.
WSI=AD1;
WSCK=1;
WSCK=0; //Bit 0.
WSI=AD0;
WSCK=1;
}
WCS=1; //Chip unselected.
j = 0x0600;
while(j!=0){wdt();j--;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -