📄 lpc_spi.c
字号:
// Filename: lpc_spi.c
// Author: Zhang Sheng
// Orgnize: Estun digital technology
// Revision Modifier Data
// xxx xxx xxx
// Function:
// LPC ARM7 SPI1 驱动,和对FM25256的操作
#include "lpc_spi.h"
// SPI的设置,在系统初始化时调用
void SPI_Init(unsigned char fdiv)
{
//使能SPI1功能
/*
P0_FUN2(20); //SSEL
P0_FUN2(19); //MOSI
P0_FUN2(18); //MISO
P0_FUN2(17); //SCLK
P2_DIROUT(18);//CS
P2_SET(18); //
*/
if(fdiv < 8)
fdiv = 8;
S1SPCCR = fdiv & 0xfe;
S1SPCR = SPI_MODE;
#if (SPI_MODE & SPCR_SPIE)
#define SPI_Int_Enable
#endif
}
// 向SPI写一个字节数据
void SPI_Write(unsigned char data)
{
//SPI_CS_CLR;//片选
S1SPDR = data;
while(0 == (S1SPSR & SPSR_SPIF));
//SPI_CS_SET;
}
// 从SPI读数据
unsigned char SPI_Read(void)
{
return (S1SPDR);
}
// 清除SPI中断标志
void SPI_ClrInt(void)
{
#ifdef SPI_Int_Enable
S1SPINT |= SPINT_IF;
#endif
}
// 写两个字节数据
void write_uint16(unsigned short data)
{
unsigned char tmp;
tmp = (unsigned char)(data & 0xff);
SPI_Write(tmp);
tmp = (unsigned char)(data>>8);
SPI_Write(tmp);
}
// 写四个字节数据
void write_uint32(unsigned int data)
{
unsigned char tmp;
tmp = (unsigned char)(data & 0xff);
SPI_Write(tmp);
data = data >> 8;
tmp = (unsigned char)(data & 0xff);
SPI_Write(tmp);
data = data >> 8;
tmp = (unsigned char)(data & 0xff);
SPI_Write(tmp);
data = data >> 8;
tmp = (unsigned char)(data & 0xff);
SPI_Write(tmp);
}
//set write enable latch
void wren(void)
{
SPI_CS_CLR;//片选
SPI_Write(FM_WREN);
SPI_CS_SET;
}
//write status register
void wrsr(unsigned char protect_byte)
{
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_WRSR);
SPI_Write(protect_byte);
//__enable_interrupt();
SPI_CS_SET;
}
//write disable
void wrdi(void)
{
SPI_CS_CLR;//片选
SPI_Write(FM_WRDI);
SPI_CS_SET;
}
//read status register
unsigned char rdsr(void)
{
unsigned char tmp = 0;
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_RDSR);
SPI_Write(FM_RDSR);//For waitting.
tmp = SPI_Read();
//__enable_interrupt();
SPI_CS_SET;
return tmp;
}
//write add bewteen 0000 and 7FFF.
//This add bewteen 000 and 7fff.
void write(unsigned short address,unsigned char indata)
{
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_WRITE);
write_uint16(address);
SPI_Write(indata);
//__enable_interrupt();
SPI_CS_SET;
}
//write
//This add bewteen 0000 and 7Fff.
void fm_write(unsigned short address, unsigned char fm_data)
{
wren();
write(address, fm_data);
wrdi();
}
// 写连续的数据 (地址自动递增)
// add bewteen 0000 and 7FFF
void fm_seqWrite(unsigned short address,unsigned char *pArray,unsigned short n)
{
unsigned short i;
wren();
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_WRITE);
write_uint16(address);
for (i = 0;i < n;i++)
{
SPI_Write(*pArray++);
}
//__enable_interrupt();
SPI_CS_SET;
wrdi();
}
//read a byte
//This add bewteen 0000 and 7Fff.
unsigned char fm_read(unsigned short address)
{
unsigned char tmp;
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_READ);
write_uint16(address);
SPI_Write(0xff);//For waitting.
tmp = SPI_Read();
//__enable_interrupt();
SPI_CS_SET;
return tmp;
}
// 读连续的数据 (地址自动递增)
// add bewteen 0000 and 7FFF
void fm_seqread(unsigned short address,unsigned short n,unsigned char *pp)
{
unsigned short i;
SPI_CS_CLR;//片选
//__disable_interrupt();
SPI_Write(FM_READ);
write_uint16(address);
for (i=0; i<n; i++)
{
SPI_Write(0xff);//For waitting.
*pp = SPI_Read();
++pp;
}
//__enable_interrupt();
SPI_CS_SET;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -