微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430F149与cc2500通讯启用USART1,SPI初始化

msp430F149与cc2500通讯启用USART1,SPI初始化

时间:11-13 来源:互联网 点击:
刚开始接触这个SPI,又是与cc2500,看着英文手册,弄了老半天,才把读写寄存器给弄清,分享一下:

//=========================================================

//本模块为spi通讯模块,程序启用USART1,针对与cc2500的相互通讯

//=========================================================

#includemsp430x14x.h>

#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;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top