⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 单片机C源程序souce
💻 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 + -