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

📄 spi.c

📁 一个基于XMODEM协议的下载字库的程序
💻 C
字号:
/**************************************************************
Copyright (C), 2002-2030, ZhongXing Information Tech. Co., Ltd.
文件名  :  SPI.c

作  者  : Lv Yanfei       版本:V1.00.00       完成日期:2006-04-17

描  述  : 本模块描述了IO脚模拟SPI接口与NX25P40通信的所有函数   
引脚接口如下:
P3.4 ---- S0
P3.5 ---- SI
P3.6 ---- SCK
PA6  ---- CS
***************************************************************/

#define SPI_GLOBAL
#include "config.h"


void SPI_SendChar(INT8U ch)
{
	INT8U data i=8;
	
	while(i--)
	{
		SCK = 0;
		if((ch & 0x80) == 0x80)	SI = 1;
		else					SI = 0;
		SCK = 1;
		ch <<= 1;
	}
} 

INT8U SPI_ReadChar(void)
{
	INT8U data i=8, ch=0;
	
	while(i--)
	{
		ch <<= 1;
		SCK = 1;
		SCK = 0;
		
		if(SO == 1)	ch |= 0x01;
		else		ch &= 0xFE;
	}
	SCK = 1;
	
	return ch;
}
////////////////////////////////////////////////////////////////
#ifdef SPI_ENABLEPROGRAM
INT8U SPI_ReadStatus(void)
{
	INT8U data ch;
	
	CS0;
	SPI_SendChar(RDSR_INST);
JREAD_STATUS0:
	ch = SPI_ReadChar();
	if((ch & 0x01) == 1)	goto JREAD_STATUS0;
	CS1;
	
	return ch;
}

void SPI_EnPro(void)
{
	CS0;
	SPI_SendChar(PREN_INST);
	CS1;
}

void SPI_DisPro(void)
{
	CS0;
	SPI_SendChar(PRDI_INST);
	CS1;
}

void SPI_EraseSector(INT8U sec)
{
	SPI_EnPro();
	CS0;
	SPI_SendChar(SECTOR_ERASE);
	SPI_SendChar(sec);
	SPI_SendChar(0x00);
	SPI_SendChar(0x00);
	CS1;
	SPI_ReadStatus();
	SPI_DisPro();		 
}
/*******************************************************************************
程序名:	SPI_EraseBulk
说  明:	擦除所有扇区
********************************************************************************/
void SPI_EraseBulk(void)
{
	INT8U i;

	for(i=0; i<8; i++)
	{
		SPI_EraseSector(i);
		delay_10ms();
	}
}
/*******************************************************************************
程序名:	SPI_Program
说  明:	从地址addr开始,连续写入len个字节,数据来源是ptr指向的内存,
********************************************************************************/
void SPI_Program(INT32U addr, INT8U len, INT8U *ptr)
{
	INT8U i, addrc, addrh, addrl;

	SPI_EnPro();
	addrl = (INT8U)addr;
	addr >>= 8;
	addrh = (INT8U)addr;
	addr >>= 8;
	addrc = (INT8U)addr;
	CS0;
	SPI_SendChar(PROGRAM_INST);
	SPI_SendChar(addrc);
	SPI_SendChar(addrh);
	SPI_SendChar(addrl);
	for(i=0; i<len; i++)
	{
		SPI_SendChar(*ptr++);
	}
	CS1;
	SPI_ReadStatus();
	SPI_DisPro();
}
#endif
/////////////////////////////////////////////////////////////////////////
/*******************************************************************************
程序名:	SPI_Read
说  明:	从地址addr开始,连续读取len个字节,保存到ptr指向的内存,
			y_n_bit 指示是否将读取的数据反显(1->0 0->1)
********************************************************************************/
void SPI_Read(INT32U addr, INT8U len, INT8U *ptr, INT8U y_n_bit)
{
	INT8U i, addrc, addrh, addrl;
	INT8U *p;

	p = ptr;
	addrl = (INT8U)addr;
	addr >>= 8;
	addrh = (INT8U)addr;
	addr >>= 8;
	addrc = (INT8U)addr;

	CS0;
	SPI_SendChar(READ_INST);
	SPI_SendChar(addrc);
	SPI_SendChar(addrh);
	SPI_SendChar(addrl);
	if(y_n_bit == 1)
	{
		for(i=0; i<len; i++)
		{
			*p++ = SPI_ReadChar();
		}
	}
	else
	{
		for(i=0; i<len; i++)
		{
			*p++ = ~(SPI_ReadChar());
		}
	}
	CS1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -