//=========================================================
//本模块为spi通讯模块,程序启用USART1,针对与cc2500的相互通讯
//=========================================================
#include
#include"spi.h"
#include"cc2500_def.h"
#define SPI_SEL P5SEL
#define SPI_DIR P5DIR
#define SPI_IN P5IN
#define SPI_OUT P5OUT
#define CSn BIT0
#define SIMO BIT1
#define SOMI BIT2
#define UCLK BIT3
void init_spi(void)//msp430 spi初始化 同步串行接口
{ SPI_DIR |= CSn; //CS 禁止
SPI_OUT |= CSn;
U1CTL |= SWRST; // 芯片复位
U1CTL |= CHAR + SYNC + MM; // 8-bit SPI 主机模式
U1TCTL |= CKPH + SSEL1 + SSEL0 + STC; // SMCLK,3线模式
U1BR0 = 0x02; // UCLK/2
U1BR1 = 0x00; // 0
U1MCTL = 0x00;
ME2 |= USPIE1; // 使能SPI #define USPIE1 (0x10)
UCTL1 &= ~SWRST; // 取消复位
SPI_SEL |= SIMO + SOMI + UCLK;//引脚功能选择,第二功能
SPI_DIR |= SIMO + UCLK; // 端口方向设置
}
//写入寄存器,是8位address + 8位data, 8位地址为 0 B A5 A4 A3 A2 A1 A0
//其中,0表示write option B表示burst写的时候,置1
//在突发方式写cc2500寄存器
//U1TXBUF = addr + CC2500_WRITE_BURST; 发送地址,起始地址加突发头#define CC2500_WRITE_BURST 0x40
//写cc2500寄存器
void spi_WriteReg(unsigned char addr,unsigned char value)
{
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI); // 等待cc2500准备好 CHIP_RDYn,stays high until power and crystal have stabilized .
//Shoule always be low when using the SPI interface.
IFG2 &= ~UTXIFG1; // 清除标志,USART1发送中断标志位
U1TXBUF = addr; // 发送地址 UxTXBUF 发送数据寄存器
while (!(IFG2 & UTXIFG1));// 等待发送完成
IFG2 &= ~UTXIFG1; // 清除标志
U1TXBUF = value; // 发送内容
while (!(IFG2 &UTXIFG1));// 等待完成
SPI_OUT |= CSn; // CS 禁止
}
//突发方式写cc2500寄存器
void spi_WriteBurstReg(unsigned char addr,unsigned char *buffer,unsigned char count)
{
unsigned char i;
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI); // 等待cc2500准备好
IFG2 &= ~UTXIFG1 ;
U1TXBUF = addr + CC2500_WRITE_BURST; // 发送地址,起始地址加突发头#define CC2500_WRITE_BURST 0x40
while (!(IFG2 & UTXIFG1)); // 等待发送完成
for (i = 0; i < count; i++)
{
U1TXBUF = buffer[i]; // 发送内容
while (!(IFG2 & UTXIFG1)); // 等待完成
IFG2 &= ~UTXIFG1 ;
}
// IFG2 &= ~URXIFG1;
//while(!(IFG2 & UTXIFG1));
SPI_OUT |= CSn; // CS 禁止
}
//读寄存器,是8位address + 8位data, 8位地址为 1 B A5 A4 A3 A2 A1 A0
//其中,1表示read option B表示burst读的时候,置1
//burst read cc2500寄存器
// U1TXBUF = (addr | CC2500_READ_BURST);发送地址#define CC2500_READ_BURST 0xC0
//读cc2500寄存器
unsigned char spi_ReadReg(unsigned char addr)
{
unsigned char x;
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI);// 等待cc2500准备好
IFG2 &= ~UTXIFG1; //清除标志
U1TXBUF = (addr | CC2500_READ_SINGLE); // 发送地址 #define CC2500_READ_SINGLE 0x80
while (!(IFG2 & UTXIFG1)); //等待发送地址完成
IFG2 &= ~UTXIFG1; //清除标志
U1TXBUF = 0; //启动传输,以便读取
while (!(IFG2&URXIFG1)); //等待接收完成
x = U1RXBUF; //读取内容
while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0发送完成
SPI_OUT |= CSn; //CS 禁止
return x;
}
//突发方式读cc2500寄存器
void spi_ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned int i;
SPI_OUT &= ~CSn; // CS使能
while (SPI_IN & SOMI);// 等待芯片准备好
IFG2 &= ~UTXIFG1; //清除标志
U1TXBUF = (addr | CC2500_READ_BURST); //发送地址#define CC2500_READ_BURST 0xC0
while (!(IFG2 & UTXIFG1)); //等待完成
for (i = 0; i < count; i++)
{
U1TXBUF = 0;
while (!(IFG2 & URXIFG1)); // 等待
buffer[i] = U1RXBUF; // 接收
while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0发送完成
IFG2 &= ~UTXIFG1; //清除标志
}
SPI_OUT |= CSn; //CS 禁止
}
//读cc2500状态
unsigned char spi_ReadStatus(unsigned char addr)
{
unsigned char x;
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI);// 等待cc2500准备好
IFG2 &= ~UTXIFG1; // 清除标志
U1TXBUF = (addr | CC2500_READ_SINGLE); // 发送地址 #define CC2500_READ_BURST 0x80
while (!(IFG2 & UTXIFG1)); // 等待发送完成
IFG2 &= ~UTXIFG1; // 清除标志
U1TXBUF = 0; // 启动传输
while (!(IFG2&URXIFG1)); // 等待接收完成
x = U1RXBUF; // 读取数据
while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0发送完成
SPI_OUT |= CSn; // CS 禁止
return x;
}