📄 spi.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 + -