?? 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 + -