spi.c

来自「博创2410的实验代码」· C语言 代码 · 共 129 行

C
129
字号
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2005.2.26
\***************************************************************************/
/***************************************************************************\
    #说明: spi接口驱动程序
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------

	----------------------------------修正--------------------------------------

	2005-2-26	创建

\***************************************************************************/

//#include "../ucos-ii/includes.h"
#include "../inc/spi.h"
#include "../inc/reg2410.h"
#include "../inc/lib.h"
#include "../inc/bitfield.h"

#define GPIO_TC_SPIMISO		(GPIO_MODE_ALT0 | GPIO_PULLUP_DIS | GPIO_E11)
#define GPIO_TC_SPIMOSI		(GPIO_MODE_ALT0 | GPIO_PULLUP_DIS | GPIO_E12)
#define GPIO_TC_SPICLK		(GPIO_MODE_ALT0 | GPIO_PULLUP_DIS | GPIO_E13)
/*SPI数据发送程序*/
void SPISend ( unsigned char val, int channel )
{


	if ( channel == 0 ){//选择SPI
		rSPTDAT0 = val; //写入数据 
		while (!(rSPSTA0 & 1));//等待发送结束
	}else if ( channel == 1 ){
		rSPTDAT1 = val;
		while (!(rSPSTA1 & 1));
	}
	
	
}

unsigned char SPIRecv ( int channel )
{
	if (channel == 0){
		return rSPRDAT0;
	}else if (channel == 1) {
		return rSPRDAT1;
	}else
		return 0xff;
}
/********************************************************************
// Function name	: Set_SIO_mode
// Description	    : 2410 SPI模式设置函数
//                    实现功能:
//                        设置2410的SPI相关寄存器
// Return type		: void
// Argument         : SPI相关寄存器值,具体参见手册P486
*********************************************************************/
void Set_SIO_mode(int channel, int nSPCON, int nSPPRE, int SPPIN,
		int *poldnSPCON, int *poldnSPPRE, int *poldSPPIN)
{	
	if(channel==0){   //使用SPI0
		if(poldnSPCON){
			*poldnSPCON=rSPCON0;
		}
		rSPCON0=nSPCON;//设置SPI控制寄存器

		if(poldnSPPRE){
			*poldnSPPRE=rSPPRE0;
		}
		rSPPRE0=nSPPRE;//SPI 波特率预分频器

		if(poldSPPIN){
			*poldSPPIN=rSPPIN0;
		}
		rSPPIN0=SPPIN; //SPI引脚控制寄存器,下面类似
	}else if(channel == 1){
		if(poldnSPCON){
			*poldnSPCON=rSPCON1;
		}
		rSPCON1=nSPCON;

		if(poldnSPPRE){
			*poldnSPPRE=rSPPRE1;
		}
		rSPPRE1=nSPPRE;

		if(poldSPPIN){
			*poldSPPIN=rSPPIN1;
		}
		rSPPIN1=SPPIN;
	}else 
		return;

	hudelay(1);
}
/********************************************************************
// Function name	: SPI_initIO
// Description	    : 2410 SPI初始化函数
//                    实现功能:
//                        将2410的相关IO口设置为SPI口
// Return type		: void
// Argument         : channel,SPI选择
*********************************************************************/

void SPI_initIO(int channel)
{
	if (channel == 0){                  //选择SPI0  
		set_gpio_ctrl (GPIO_TC_SPIMISO);//设置GPE11-13,参见手册P273
		set_gpio_ctrl (GPIO_TC_SPIMOSI);
		set_gpio_ctrl (GPIO_TC_SPICLK);
	}else if (channel == 1) {

	}
}
/********************************************************************
// Function name	: SPI_init
// Description	    : 2410 SPI初始化函数
//                    实现功能:
//                        2410的SPI进行初始化设置
// Return type		: void
// Argument         : VOID
*********************************************************************/
void SPI_init(void)
{SPI_initIO(0);                 //设置GPE11-GPE13为SPI端口
	Set_SIO_mode(0, SPCON_SMOD_POLL | 
		SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH | //SPI模式设置
		SPCON_CPHA_FMTA, 33, 2, NULL, NULL, NULL);
}

⌨️ 快捷键说明

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