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

📄 spi.c

📁 在LPC2132的ARM处理器上
💻 C
字号:
/********************************************************************************************************/
#include "config.h"

#define SPI_CPHA_TWO        0x08
#define SPI_CPHA_ONE        0x00

#define SPI_CPOL_LOW        0x10
#define SPI_CPOL_HIGH       0x00

#define SPI_MSTR_MASTER     0x20
#define SPI_MSTR_SLAVE      0x00

#define SPI_LSBF_BIT0       0x40
#define SPI_LSBF_BIT7       0x00

#define SPI_SPIE_EN         0x80
#define SPI_SPIE_DISABLE    0x00

#ifndef  SPI0_MOD
#define SPI0_MOD   SPI_CPHA_ONE | SPI_CPOL_LOW | SPI_LSBF_BIT7
#endif

#ifndef  SPI1_MOD
#define SPI1_MOD   SPI_CPHA_ONE | SPI_CPOL_HIGH | SPI_LSBF_BIT7			//注意CH432和AT45DB021的相位模式不对
#endif
/*********************************************************************************************************/
uint8 SPI0Init(uint8 Fdiv)
{
    PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x5500;  	/* 选择管脚为SPI0 */
	
    SPI_SPCCR = Fdiv & 0xfe;                    	/* 分频值 */
    SPI_SPCR = 0x20 | SPI0_MOD;                  	/* 主机、不允许中断 */
    
    return TRUE;
}

/*********************************************************************************************************/
uint8 SPI1Init(uint8 Fdiv)
{
    PINSEL1 = (PINSEL1 & 0xfffffc03) | 0x02a8;  	/* 选择管脚为SPI1 */
    
    SSPCR0 = (0x01 << 8) |              // SCR  设置SPI时钟分频
             (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
             (0x00 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
             (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
             (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
             (0x00 << 2) |              // MS   主从选择,0=主机,1=从机
             (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
             (0x00 << 0);               // LBM  回写模式
             
    SSPCPSR = 0x04;		                // PCLK分频值
    SSPIMSC = 0x07;                     // 中断屏蔽寄存器
    SSPICR  = 0x03;                     // 中断清除寄存器

    PINSEL1 = (PINSEL1 & 0xfffffffc) | 0x00000001;	//设置p0.16为EINT0
	
	EXTMODE |= 0x01;			// 设置EINT0为边沿触发
	EXTPOLAR &= 0xfe;			// 设置EINT0为下降沿有效 
	
    return TRUE;
}

/*********************************************************************************************************/
static uint8 Read_F(uint8 adr)
{
	uint8 temp;

	temp = adr << 2;
	temp &= 0xfd;
	return temp;
}

/*********************************************************************************************************/
static uint8 Write_F(uint8 adr)
{
   	uint8 temp;

	temp = adr << 2;
	temp |= 0x02;
	return temp;
}

/*********************************************************************************************************/
uint8	SPI1_Oper(uint8 data)
{

	SSPDR = data;
	
    while( (SSPSR & 0x01) == 0 );	    // 等待TFE置位,即发送FIFO空   
		
    return(SSPDR);		
	
}

/*********************************************************************************************************/
uint8 SPIRW(uint8 *Rt, uint8 Data)
{ 
    SPI_SPDR = Data;
    
    while((S0PSR & 0x80) == 0x00);
    
    *Rt = S0PDR;
     	
	return TRUE;
}

/*********************************************************************************************************/
void	CH432T_SPI_Write(uint8 addr, uint8 data)
{
	uint8 i;
		
	IO1CLR |= UARTCS;				 		/* 设置P1.25输出为0*/
	
	for (i = 0x00; i < 8; i++);
	
	SPI1_Oper(Write_F(addr));
	
	SPI1_Oper(data);
	
	for (i = 0x00; i < 32; i++);
	
	IO1SET |= UARTCS;				 		/* 设置P1.25输出为1*/
	
	for (i = 0x00; i < 8; i++);
}

/*********************************************************************************************************/
uint8	CH432T_SPI_Read(uint8 addr)
{
	uint8	spi_data, i;
	
	IO1CLR |= UARTCS;				 		/* 设置P1.25输出为0*/
	
	for (i = 0x00; i < 8; i++);
	
	SPI1_Oper(Read_F(addr));
	
	//spi_data = SPI1_Oper(0x00);
	
	SPI1_Oper(0x00);
	
	for (i = 0x00; i < 32; i++);
	
	spi_data =SSPDR;
	
	IO1SET |= UARTCS;				 		/* 设置P1.25输出为1*/
	
	for (i = 0x00; i < 8; i++);
	
	return(spi_data);				
}

/*********************************************************************************************************/


⌨️ 快捷键说明

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