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 + -
显示快捷键?