最近一直在做程序的移植,到430的SPI口通信时根本接收不到从设备发过来的数据或者SPI口根本就没有将指令发

最近一直在做程序的移植,到430的SPI口通信时根本接收不到从设备发过来的数据或者SPI口根本就没有将指令发,第1张

你的是msp430还是cc2430吗?我用的是msp430f5438,一开始收不到数据是因为线没有接好,后来接到数据,发现数据不对,但会随着发送的数据变化而变化,调试发现是SCK没配置好,用spi通信区别于uart的就是它是同步的,因此主从设备间的SCK一定要匹配,否则就会出现收不到数或收到数据不对。希望能帮到你,我也是刚了解spi,才有了点感悟。

430的SPI用过,但是没用过SD卡。

下面是我写的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)// 写入一个伪数据

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11206124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存