📄 tx.c
字号:
//compiler-IAR FOR MSP430 3.10A
//MCU--MSP430F135
//作者--宋光春,QQ928853769,2008.04.23
#include <msp430x14x.h>
#include "float.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "intrinsics.h"
#include "TX.h"
UCHAR InitData[15];
UCHAR TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
UCHAR TxBuf[10]={0xfe,0xfb,0xef,0xff,0xff,0xff,0xff,0xff,0x00,0xbf};
UCHAR RxBuf[10];
UCHAR Buf;
UINT y;
UINT count=0;
UCHAR RX_Data[10];
int i=0;
/********************端口初始化****************/
void init_io(void)
{
//DDRA=0xff; //端口1全部为输出
//PORTA=0xff; //
P2DIR |= PWR; //PWR为单片机输出引脚
P1DIR |= CE; //CE为单片机的输出脚
P1DIR |= CS; //CS为单片机的输出脚
P1DIR |= CLK1; //CLK1为单片机的输出脚
P1DIR |= DATA; //DATA为单片机的输出脚
P1DIR &= ~DR1; //DR1为单片机输入脚
//P1IN &= 0x00; //DR1输出低电平
}
/****************BuildSPIWord*********************/
void buildinit_word(void)
{
InitData[0]=0x00;//RX receiver 2,Datalength 0bit
InitData[1]=0x50;//RX receiver 1,Datalength 80bit
InitData[2]=0x00;
InitData[3]=0xcc;
InitData[4]=0xcc;
InitData[5]=0xcc;
InitData[6]=0xcc;
InitData[7]=0x00;
InitData[8]=0xcc;//RX receive 1 address High byte
InitData[9]=0xcc;//RX receive 1 address High byte
InitData[10]=0xcc;//RX receive 1 address Low byte
InitData[11]=0xcc;//RX receive 1 address Low byte
InitData[12]=0x83;//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0)
InitData[13]=0x6f;//One receiver(Bit7), shock Mode(Bit6), Datarate(Biit5) 250K, crystal(Bit4-Bit2),RF_Power(Bit1-Bit0)
InitData[14]=0x05;//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/************delay*****************/
void delay(UINT x)
{
UCHAR j;
y = x;
while((x--)!=0)
{
for(j=0;j<125;j++);
}
}
void delay_1us(void)
{
_NOP();
}
/******************配置操作****************/
void Config2401(void)
{
int i;
P2OUT |= PWR; //单片机PWR引脚输出高电平,上电
P1OUT &= ~CS; //单片机CS输出低电平
P1OUT &= ~CE; //单片机CE输出低电平
P1OUT &= ~CLK1; //单片机CLK1输出低电平
delay(20);
P1OUT |= CS; //单片机CS输出高电平
for(i=0;i<15;i++)
{
ByteWrite(InitData[i]);
}
delay(6); //延时600us
P1OUT &= ~CS; //单片机CS输出低电平
P1OUT &= ~DATA; //单片机DATA输出低电平
}
/////////////////////////////////
void ByteWrite(UCHAR send)
{
UCHAR i;
Buf = send;
for (i=0;i<8;i++)
{
if (send&0x80)
{
P1OUT |= DATA; //单片机DATA输出高电平
}
else
{
P1OUT &= ~DATA; //单片机DATA输出低电平
}
_NOP();
P1OUT |= CLK1; //单片机CLK1输出高电平
send=send<<1;
P1OUT &= ~CLK1; //单片机CLK1输出低电平
}
}
/***********设置RF2401 为发送模式**********/
void SetTxMode(void)
{
P1OUT |= CS; //单片机引脚CS输出高电平
delay_1us();
delay_1us();
delay_1us();
delay_1us();
delay_1us();
P1OUT &= ~DATA; //单片机引脚DATA输出低电平
_NOP();
P1OUT |= CLK1; //单片机引脚CLK1输出高电平
_NOP();
P1OUT &= ~CLK1; //单片机引脚CLK1输出低电平
delay(6); //延时600us
P1OUT &= ~CS; //单片机引脚CS输出低电平
P1OUT |= CE; //单片机引脚CE输出高电平
delay_1us();
}
/******nRF2401数据发送函数****/
void RF2401_TxPacket(void)
{
int i;
for(i=0;i<(ADDR_W/8);i++) //写入接收地址(按字节对齐)
{
ByteWrite(TxAddress[i]);
}
for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
{
ByteWrite(TxBuf[i]);
}
P1OUT &= ~CE; //CE置低使发送有效---使能shockburst
P1OUT &= ~DATA;
delay(1);
delay(1);
}
/*******设置RF2401 为接收模式********/
void SetRxMode(void)
{
P1OUT |= CS; //单片机引脚CS输出高电平
delay_1us();
delay_1us();
delay_1us();
delay_1us();
delay_1us();
P1OUT |= DATA; //单片机引脚DATA输出高电平
_NOP();
P1OUT |= CLK1;
_NOP();
P1OUT &= ~CLK1;
delay(6);//延时600us
P1OUT &= ~CS; //单片机引脚CS输出低电平
P1OUT |= CE; //单片机引脚CE输出高电平
delay(1);
}
///////////////////////////
UCHAR ByteRead(void)
{
UCHAR i;
UCHAR DATA_BUF;
for(i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
if (P1IN&DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=0x01;
}
else
{
DATA_BUF&=~(0x01);
}
P1OUT &= ~CLK1; //单片机引脚CLK1输出低电平
P1OUT |= CLK1; //单片机引脚CLK1输出高电平
}
return DATA_BUF;
}
/******nRF2401数据接收函数****/
unsigned char nRF2401_RxPacket(void)
{
UINT i;
if(P1IN&DR1)
{
P1OUT |= CLK1; //单片机引脚CLK1输出高电平
P1DIR &= ~DATA; //单片机引脚DATA为输入模式
//P1IN &= ~DATA; //单片机引脚DATA输入0
//P1IN &= ~0x01;
for (i=0;i<DATA1_W/8;i++)
{
RxBuf[i]=ByteRead();
}
P1OUT &= ~CLK1;
P1OUT |= DATA; //单片机引脚DATA输出高电平
P1OUT &= ~DATA;
return 1;
}
return 0;
}
/*************************主函数***************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BCSCTL1 &= ~XT2OFF;
do
{
IFG1 &= ~OFIFG;
for(i=0xff;i>0;i--);
}while(IFG1 & OFIFG);
BCSCTL2 |= SELM_2 + SELS; //MCLK = 8M SMCLK=8M
init_io();
buildinit_word(); //生成配置内容
Config2401(); // 必须执行的配置操作
SetTxMode(); // 设置为发送模式
RF2401_TxPacket(); // 发送测试数据
_NOP();
// PORTA&=~(0x10);
delay(10000); // 延时使LED灯点亮
//PORTA|=0x10;
// SetRxMode(); // 设置RF2401 为接收模式
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -