下面是我写的SPI的驱动程序
/*******************************************************************************
文件名称: SPI.c
作者:启岩QQ:516409354
版本:v1.1 日期:2011.07.27
文件描述: msp430x1x系列单片机SPI *** 作,接收和查询均采用查询方式.兼容片上SPI功能和
IO模拟功能,通过配置SPI_MODE来确定模式选择
函数列表:
修改历史:
版本日期作者 改动内容和原因
----------------------------------------------------
1.0 2011.07.27xmx 使用MSP430的SPI模式完成基本的功能完成
1.1 2011.08.09xmx 兼容片内SPI和总线模拟SPI时序
*******************************************************************************/
#include <msp430x14x.h>
/***********SPI模式,0-总线模拟,1-内部UART的SPI模式****************/
#define SPI_MODE0x00
/************* IO模拟时序时的端口定义 ***********/
#define SPI_SIMOBIT1
#define SPI_SOMIBIT2
#define SPI_SCLKBIT3
#define SPI_SIMO_OUT() (P3DIR |= SPI_SIMO)
#define SPI_SOMI_IN() (P3DIR &= ~SPI_SOMI)
#define SPI_SCLK_OUT() (P3DIR |= SPI_SCLK)
#define SPI_SCLK_SET() (P3OUT |= SPI_SCLK)
#define SPI_SCLK_CLR() (P3OUT &= ~SPI_SCLK)
#define SPI_SIMO_SET() (P3OUT |= SPI_SIMO)
#define SPI_SIMO_CLR() (P3OUT &= ~SPI_SIMO)
#define SPI_SOMI_BIT() (P3IN &SPI_SOMI)
/*********************************************************************
* 函 数 名: SPI_Init
* 功能描述: SPI初始化。
* 函数说明: SMCLK=2MHz,SPI时钟源SMCLK/2=1MHz。3线SPI master 模式。
* 调用函数: 无
* 全局变量: 无
* 输入: 无
* 返回: 无
***********************************************************************/
void SPI_Init(void)
{
#if SPI_MODE >0
P3SEL |= 0x0E // P3.1-P3.3设置为SPI接口
U0CTL |= SWRST// 允许软件复位
//U0CTL |= LISTEN // 回环模式,测试用
U0CTL |= CHAR + SYNC + MM // 8-bit,spi mode,usart is master
U0TCTL |= STC // 3-pin SPI mode
U0TCTL |= SSEL1 + SSEL0 // UCLK时钟源SMCLK 2MHZ
U0TCTL |= CKPH// UCLKt延时1个半周期
U0TCTL &= ~CKPL // 上升沿写数据,下降沿读数据
U0TCTL |= TXEPT // U0TXBUF和TX移位寄存器清空
U0BR0 = 0x02 // 2分频,SPI时钟频率为SMCLK/2
U0BR1 = 0x00
U0MCTL = 0x00 // SPI模式下设置为000H
ME1 |= USPIE0 // 允许USART0为SPI模式
U0CTL &= ~SWRST // 禁止软件复位
IE1 &= ~(UTXIE0 + URXIE0) // 禁止收发中断
#else
SPI_SIMO_OUT()
SPI_SOMI_IN()
SPI_SCLK_OUT()
#endif
}
/*********************************************************************
* 函 数 名: SPI_WriteRead
* 功能描述: SPI读写函数。
* 函数说明: 向SPI写一个字节并读出一个字节。读写位顺序:MSB--------LSB
* 调用函数: 无
* 全局变量: 无
* 输入: wByte:要写入SPI的数据.
* 返回: 读取到的数据。
***********************************************************************/
unsigned char SPI_WriteRead(unsigned char wByte)
{
unsigned char rByte
#if SPI_MODE >0
U0TXBUF = wByte // 向SPI发送寄存器写入数据
while(!(IFG1 &UTXIFG0)) // 等待发送完成
IFG1 &= ~UTXIFG0
while(!(IFG1 &URXIFG0)) // 等待接收到数据
rByte = U0RXBUF // 读取SPI接收寄存器的值
#else
unsigned char i
for(i = 0i <8i++)
{
SPI_SCLK_CLR()// 拉低时钟
if(wByte &0x80)// 取得发送字节最高位
{
SPI_SIMO_SET()// 若最高位为1则输出1
}
else
{
SPI_SIMO_CLR()
}
SPI_SCLK_SET()// 上升沿写数据
wByte <<= 1 // 发送字节左移一位
rByte <<= 1 // 将接收字节左移一位
if(SPI_SOMI_BIT()) // 若时钟线为高
{
rByte |= 0x01
}
SPI_SCLK_CLR()// 下降沿读数据
}
#endif
return rByte
}
/*********************************************************************
* 函 数 名: SPI_WriteByte
* 功能描述: SPI写函数。
* 函数说明: 向SPI写一个字节。
* 调用函数: SPI_WriteRead
* 全局变量: 无
* 输入: wByte:要写入SPI的数据.
* 返回: 无
***********************************************************************/
void SPI_WriteByte(unsigned char wByte)
{
SPI_WriteRead(wByte)
}
/*********************************************************************
* 函 数 名: SPI_WriteByte
* 功能描述: SPI读函数。
* 函数说明: 从SPI读取一个字节。
* 调用函数: SPI_WriteRead
* 全局变量: 无
* 输入: 无
* 返回: 读取到的数据。
***********************************************************************/
unsigned char SPI_ReadByte(void)
{
return SPI_WriteRead(0xFF)// 写入一个伪数据
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)