msp430F149與cc2500通訊啟用USART1,SPI初始化
//=========================================================
//本模塊為spi通訊模塊,程序啟用USART1,針對(duì)與cc2500的相互通訊
//=========================================================
#include<msp430x14x.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; // 芯片復(fù)位
U1CTL |= CHAR + SYNC + MM; // 8-bit SPI 主機(jī)模式
U1TCTL |= CKPH + SSEL1 + SSEL0 + STC; // SMCLK,3線模式
U1BR0 = 0x02; // UCLK/2
U1BR1 = 0x00; // 0
U1MCTL = 0x00;
ME2 |= USPIE1; // 使能SPI #define USPIE1 (0x10)
UCTL1 &= ~SWRST; // 取消復(fù)位
SPI_SEL |= SIMO + SOMI + UCLK;//引腳功能選擇,第二功能
SPI_DIR |= SIMO + UCLK; // 端口方向設(shè)置
}
//寫入寄存器,是8位address + 8位data, 8位地址為 0 B A5 A4 A3 A2 A1 A0
//其中,0表示write option B表示burst寫的時(shí)候,置1
//在突發(fā)方式寫cc2500寄存器
//U1TXBUF = addr + CC2500_WRITE_BURST; 發(fā)送地址,起始地址加突發(fā)頭#define CC2500_WRITE_BURST 0x40
//寫cc2500寄存器
void spi_WriteReg(unsigned char addr,unsigned char value)
{
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI); // 等待cc2500準(zhǔn)備好 CHIP_RDYn,stays high until power and crystal have stabilized .
//Shoule always be low when using the SPI interface.
IFG2 &= ~UTXIFG1; // 清除標(biāo)志,USART1發(fā)送中斷標(biāo)志位
U1TXBUF = addr; // 發(fā)送地址 UxTXBUF 發(fā)送數(shù)據(jù)寄存器
while (!(IFG2 & UTXIFG1));// 等待發(fā)送完成
IFG2 &= ~UTXIFG1; // 清除標(biāo)志
U1TXBUF = value; // 發(fā)送內(nèi)容
while (!(IFG2 &UTXIFG1));// 等待完成
SPI_OUT |= CSn; // CS 禁止
}
//突發(fā)方式寫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準(zhǔn)備好
IFG2 &= ~UTXIFG1 ;
U1TXBUF = addr + CC2500_WRITE_BURST; // 發(fā)送地址,起始地址加突發(fā)頭#define CC2500_WRITE_BURST 0x40
while (!(IFG2 & UTXIFG1)); // 等待發(fā)送完成
for (i = 0; i < count; i++)
{
U1TXBUF = buffer[i]; // 發(fā)送內(nè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讀的時(shí)候,置1
//burst read cc2500寄存器
// U1TXBUF = (addr | CC2500_READ_BURST);發(fā)送地址#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準(zhǔn)備好
IFG2 &= ~UTXIFG1; //清除標(biāo)志
U1TXBUF = (addr | CC2500_READ_SINGLE); // 發(fā)送地址 #define CC2500_READ_SINGLE 0x80
while (!(IFG2 & UTXIFG1)); //等待發(fā)送地址完成
IFG2 &= ~UTXIFG1; //清除標(biāo)志
U1TXBUF = 0; //啟動(dòng)傳輸,以便讀取
while (!(IFG2&URXIFG1)); //等待接收完成
x = U1RXBUF; //讀取內(nèi)容
while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0發(fā)送完成
SPI_OUT |= CSn; //CS 禁止
return x;
}
//突發(fā)方式讀cc2500寄存器
void spi_ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
unsigned int i;
SPI_OUT &= ~CSn; // CS使能
while (SPI_IN & SOMI);// 等待芯片準(zhǔn)備好
IFG2 &= ~UTXIFG1; //清除標(biāo)志
U1TXBUF = (addr | CC2500_READ_BURST); //發(fā)送地址#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發(fā)送完成
IFG2 &= ~UTXIFG1; //清除標(biāo)志
}
SPI_OUT |= CSn; //CS 禁止
}
//讀cc2500狀態(tài)
unsigned char spi_ReadStatus(unsigned char addr)
{
unsigned char x;
SPI_OUT &= ~CSn; // CS 使能
while (SPI_IN & SOMI);// 等待cc2500準(zhǔn)備好
IFG2 &= ~UTXIFG1; // 清除標(biāo)志
U1TXBUF = (addr | CC2500_READ_SINGLE); // 發(fā)送地址 #define CC2500_READ_BURST 0x80
while (!(IFG2 & UTXIFG1)); // 等待發(fā)送完成
IFG2 &= ~UTXIFG1; // 清除標(biāo)志
U1TXBUF = 0; // 啟動(dòng)傳輸
while (!(IFG2&URXIFG1)); // 等待接收完成
x = U1RXBUF; // 讀取數(shù)據(jù)
while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0發(fā)送完成
SPI_OUT |= CSn; // CS 禁止
return x;
}
評(píng)論