首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]MC9SDG128B驱动NRF905无线模块的问题

[原创]MC9SDG128B驱动NRF905无线模块的问题

我试着用SPI接口去驱动NRF905,程序是从51上移植过来的,程序如下:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12dj128b"

#define uchar unsigned char
#define uint unsigned int
/************************************************************
#define TXEN_1 PORTA|=0x40 //TXEN--PA6
#define TXEN_0 PORTA&=0xbf

#define TRX_CE_1 PORTA|=0x80 //TRX_CE--PA7
#define TRX_CE_0 PORTA&=0x7f

#define PWR_UP_1 PORTA|=0x10 //PWR_UP--PA4
#define PWR_UP_0 PORTA&=0xef

#define DR PORTA_BIT5 //DR--PA5

#define CSN_1 PORTA|=0x04 //SCN--PA2
#define CSN_0 PORTA&=0xfb
/**************************************************************/
#define TXEN PORTA_BIT6 //TXEN--PA6

#define TRX_CE PORTA_BIT7 //TRX_CE--PA7

#define PWR_UP PORTA_BIT4 //PWR_UP--PA4

#define DR PORTA_BIT5 //DR--PA5

#define CSN PORTA_BIT2 //SCN--PA2

#define LED PORTA_BIT3
/****************************************************************/
uchar TxRxBuffer[]={1,2,3,4,5,6,7};
uchar senddata[]={0x06,0x40,0x5f,0x6b,0x66};
uchar RFConf[11]=
{
0x00, //i配置命令//i
0x7b, //CH_NO,i配置频段在433.2MHZ 0x6c
0x0e, //i输出功率为10db,i不重发,节电为正常模式 0x0e
0x44, //i地址宽度设置,为4字节
0x07,0x07, //i接收发送有效数7字节
0xE7,0xE7,0xE7,0xE7, //i接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};
//*******************************************************************
void delay(uint);
void initialize_SPI(void);
void initSCI0(void);
void SCI0_send(uchar x);
void SPIwrite(uchar);
void initPA(void);
void RxPacket(void);
void TxPacket(uchar *P);
void Ini_System(void);
void Wait_Rec_Packet(void);
void initialsystermclock(void);
//*******************************************************************
void main(void) {
CSN=1;
initPA();
initialize_SPI();
Ini_System();
initSCI0();
initialsystermclock();
//Wait_Rec_Packet();
while(1) {
TxPacket(TxRxBuffer);
}
}
/*********************************************************************/
void delay(uint x)
{
uint i;
for(i=0;i ;
}
}
/**********************************************************************/
void initialsystermclock(void)
{
PLLCTL=0x00;
CLKSEL=0x00;
SYNR=3;
REFDV=0; //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
}
/***********************串口通讯程序*****************************/
void initSCI0(void) {
uchar clear;
SCI0BDL=52; //MCLK=8MHz,波特率为9600
SCI0BDH=0x00; //SCIbaudrate=SCI module clock/(16*SCIBR[12:0])
SCI0CR1=0x00; //bit5,数据格式控制,1起始位,8数据位,1停止位,不打开奇偶校验//,奇校验
//SCI1CR2=0x2c; //发送保持器空标志位,TIE=1时,允许中断。可以写入下一数据?
clear=SCI0SR1;
}

void SCI0_send(uchar x){
uchar data;
SCI0CR2=0x08; //仅允许发送
SCI0DRL=x; //写发送数据
while(SCI0SR1!=0x80); //发送结束标志
data= SCI0DRL;
}
/*********************************************************************************/
void initialize_SPI(void)
{
DDRS=0xf0;
PTS=0x00;
SPI0BR=0x45; //32分频,SCK频率25kHz
SPI0CR1=0x14; //作为主控机,驱动一个从属部件,
//传输过程中/SS始终保持低,最高位最先移出,禁止中断和使能
SPI0CR2=0x00; //禁止MODF错误中断
SPI0DR=0x00; //数据寄存器清空
SPI0SR=0x00; //状态寄存器清空,SPIF置位后,先读SPI0SR后读或写SPI0DR清SPI0SR
SPI0CR1=0x54; //启动SPI接口
}
/////////////////////////////////////////////////////
void SPIwrite(uchar data) {
uint status;
while((SPI0SR&0x20)==0x00);
status=SPI0SR;
SPI0DR=data;
while((SPI0SR&0x80)==0x00);
status=SPI0SR;
status=SPI0DR;
}
//////////////////////////////////////////////////////
void initPA(void) {
DDRA=0xdf;
PORTA=0x20;
}
//////////////////////////////////////////////////////
uchar SPIread(void) {
uint status;
while((SPI0SR&0x20)==0x00);
status=SPI0SR;
SPI0DR=0xff;
while((SPI0SR&0x80)==0x00);
status=SPI0SR;
status=SPI0DR;
return status;
}
//////////////////////////////////////////////////////
void TxPacket(uchar *P)
{
uchar i;
TRX_CE=0;
TXEN=1;
CSN=0;
SPIwrite(0x22); //i写发送地址,i后面跟4字节地址//
SPIwrite(0xE7);
SPIwrite(0xE7);
SPIwrite(0xE7);
SPIwrite(0xE7);
CSN=1;
asm(nop;);asm(nop;);
asm(nop;);asm(nop;);
CSN=0;
SPIwrite(0x20); //i写发送数据命令,i后面跟三字节数据//
for(i=0;i<7;i++)
SPIwrite(P);
CSN=1;
asm(nop;);asm(nop;);
asm(nop;);asm(nop;);
TRX_CE=1; //i使能发射模式//
delay(5000); //i等带发送完成//
TRX_CE=0;
while(!DR);
SCI0_send(0xaa);

}
///////////////////////////////////////////////////////////////
void Ini_System(void)
{
uchar i;
CSN=1;
PWR_UP=1;
TRX_CE=0;
TXEN=0;
asm(nop;);
asm(nop;);
CSN=0;
for(i=0;i<11;i++)
{
SPIwrite(RFConf);
}
CSN=1;
PWR_UP=1;
TRX_CE=1;
TXEN=0;
delay(1000);
}
////////////////////////////////////////////////////
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer = SPIread();
i++;
}
}
///////////////////////////////////////////////////////////////
void Wait_Rec_Packet(void)
{
TXEN=0;
TRX_CE=1;
while(1)
{
if(DR)
{
TRX_CE=0; //i如果数据i准备好,则进入i待机模式,以便SPI口操作
CSN=0;
SPIwrite(0x24);
RxPacket();
SCI0_send(0x55);
CSN=1;
break;
}
}
}
///////////////////////////////////////////////////////////////////////

串口用来输出调试信息,自己感觉数据发射出去了
但是用51做的接受模组就是收不到数据,请高手多多指教!!
急用谢谢!
各位,加油啊
#include
#include
//#include
#include
#define uint unsigned int
#define uchar unsigned char
#define jsmzflag
//uchar code settime[8]={64,89,35,49,18,7,9}; //09year,sunday,12mon,31date,23clock,59min,40second
//uchar savetime[];
uchar TxRxBuffer[]={0x01,0x02,0x04,0x08};
unsigned char code RFConf[11]=
{
0x00, //i配置命令//i
0x7b, //CH_NO,i配置频段在433.2MHZ 0x6c
0x0e, //i输出功率为10db,i不重发,节电为正常模式 0x0e
0x44, //i地址宽度设置,为4字节
0x07,0x07, //i接收发送有效数7字节
0xE7,0xE7,0xE7,0xE7, //i接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};
#ifdef jsmzflag
sbit TRX_CE=P0^0;
sbit TXEN =P0^1;
sbit PWR_UP=P0^2;
sbit MISO =P0^3;
sbit DR =P0^4;
sbit SCK =P0^6;
sbit MOSI =P0^5;
sbit CSN =P0^7;
#else
sbit TRX_CE=P0^1;
sbit TXEN =P0^0;
sbit PWR_UP=P0^2;
sbit MISO =P0^4;
sbit DR =P0^3;
sbit SCK =P0^6;
sbit MOSI =P0^5;
sbit CSN =P0^7;
#endif
/////////////////////////////////////////////////
void SPIwrite(uchar a)
{
uchar i;
for(i=0;i<8;i++)
{
SCK=0;
_nop_();_nop_();_nop_();
MOSI=(bit)(a&0x80);
a<<=1;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();_nop_();_nop_();
SCK=0;
}
SCK=0;
}
////////////////////////////////////////////////////
uchar SPIread(void)
{
uchar i,a;
for(i=0;i<8;i++)
{
a<<=1;
_nop_();_nop_();
SCK=0;
_nop_();_nop_();
a|=MISO;
SCK=1;
_nop_();_nop_();
SCK=0;
_nop_();_nop_();
}
SCK=0;
return a;
}
////////////////////////////////////////////////////
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer = SPIread();
i++;
}
}
//////////////////////////////////////////////////////
void TxPacket(uchar *P)
{
uchar i;
TXEN=1;
CSN=0;
SPIwrite(0x22); //i写发送地址,i后面跟4字节地址//
SPIwrite(0xE7);
SPIwrite(0xE7);
SPIwrite(0xE7);
SPIwrite(0xE7);
CSN=1;
_nop_();_nop_();
CSN=0;
SPIwrite(0x20); //i写发送数据命令,i后面跟三字节数据//
for(i=0;i<7;i++)
SPIwrite(P);
CSN=1;
_nop_();_nop_();
TRX_CE=1; //i使能发射模式//
delay(50); //i等带发送完成//
while(!DR);
TRX_CE=0;
}
///////////////////////////////////////////////////////////////
void Ini_System(void)
{
uchar i;
CSN=1;
SCK=0;
PWR_UP=1;
TRX_CE=0;
TXEN=0;
_nop_();
CSN=0;
for(i=0;i<11;i++)
{
SPIwrite(RFConf);
}
CSN=1;
PWR_UP=1;
TRX_CE=1;
TXEN=0;
delay(1000);
}
///////////////////////////////////////////////////////////////
void Wait_Rec_Packet(void)
{
uchar i;
TXEN=0;
TRX_CE=1;
while(1)
{
if(DR)
{
TRX_CE=0; //i如果数据i准备好,则进入i待机模式,以便SPI口操作
CSN=0;
SPIwrite(0x24);
RxPacket();
CSN=1;
if(TxRxBuffer[0]==0x55){
Get1302(TxRxBuffer);
TxPacket(TxRxBuffer);
}
}
}
}
///////////////////////////////////////////////////////////////////////
main()
{
uchar i;
inituart();
Ini_System();
Set1302(settime);
while(1)
{
//if(flag)
// {
//Get1302(TxRxBuffer);
//for(i=0;i<7;i++)
//uart_send(TxRxBuffer);
//delay(40000);
TxPacket(TxRxBuffer);
//delay(40000);
//flag=0;
// }
}
}

这是51的驱动程序,只是更改了使能管脚定义,为什么接收不到数据呢?


各位,加油啊
各位高手请指点一下呀!
各位,加油啊
NRF905基本特性
工作电压:1.9-3.6V
调制方式: GFSK
接收灵敏度:-100dBm
最大发射功率: 10mW (+10dBm)
最大传输数率:50kbps
瞬间最大工作电流: <30mA
工作频率:(422.4-473.5MHZ)
======================================================================
接收发送功能合一,收发完成中断标志
433/868/915工作频段,433MHZ开放ISM频段可免许使用
最高发射速率50KBPS,10dbm发射功率条件下,配外置鞭状天线通信距离在300米左右。
室内通信良好通信效果,4层之间可实现有效通信,抗干扰性能强,很强的扰障碍穿透性能。
单次最多可发送接收32字节,并可软件设置发送/接收缓冲区大小2/4/8/16/32字节
170个频道,可实现多点网络通讯,结合TDMA-CDMA-FDMA原理,实现无线网络通讯。
内置硬件8/16位CRC校验,数据传输可*稳定,降低系统开发难度,。
1.9-3.6V工作,低功耗,待机模式仅2.5uA.
内置SPI接口,最高SPI时钟可大10M,也可通过I/O口模拟SPI实现。
NRF905模块应用领域:
车辆监控、遥控、遥测、小型无线网络、无线抄表、门禁系统、小区传呼、工业数据采集系统、
无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火系统、无线遥控系统、
生物信号采集、水文气象监控、机器人控制、无线232数据通信、无线485/422数据通信等。
5分钟了解常见短距离无线芯片的基本特点,正确选择
http://shop35079098.taobao.com/shop/xshop/wui_page-15620063.htm
微功率(10mW-10dbm)NRF905模块开发文档:http://www.newmsg.com/products/NewMsg-RF905.pdf  (视距200米左右)
中功率(100mW-20dbm)NRF905模块开发文档:http://www.newmsg.com/Products/NewMsg-RFC30F.pdf (视距600米左右)
中功率(500mW-27dbm)NRF905模块开发文档:http://www.newmsg.com/Products/NewMsg-RFC27A.pdf (视距1500米左右)
大功率(1000mW-30dbm)NRF905模块开发文档:http://www.newmsg.com/Products/NewMsg-RFC30A.pdf (视距2500米左右)
大功率(1000mW-33dbm)NRF905模块开发文档:http://www.newmsg.com/Products/NewMsg-RFC33A.pdf (视距5000米左右)
大功率(5000mW-38dbm)NRF905模块开发文档:http://www.newmsg.com/Products/NewMsg-RFC905H.pdf(视距20,000米左右)
用示波器看一下SPI端口上有没有通讯信号,波形对不对。
海纳百川  有容乃大
头都大了,别人的程序不太好看哦
飞思卡尔8/16/32位多功能开发板/下载器:
网站:http://www.lqist.cn,
淘宝店:http://shop36265907.taobao.com
你好,我们制造供应NRF905 RF903 CC1100 CC2500 CC1020 NRF2401 NRF24L01 无线数传芯片/模块有助于工程选型,希望对大家有帮助,少走弯路,欢迎交流欢迎在线交流,联系方式:QQ: 35625400  MSN: ll88mm88@hotmail.com 电话: 13704018223 陈工
NORDIC系列:NRF24L01/NRF24L01P/NRF905/NRF24LE1/NRF24LU1P
TI系列:CC1020/CC1101/CC1110/CC2500/CC2530
PTC系列:PT4450/PT4452/PT4455/PT4301-X/PT4302-X/PT4317-X/RX3310A-LF
Amiccom系列:A7121/A7105/A7125/A7325/A7205/A7102/A7103/A7201/A7302
以上系列射频芯片及模块,在研发样品阶段需要样品支持,试产阶段需要少批量支持,大批量生产阶段需要长期稳定供应,甚至协助做产品优化,请随时联系!http//www.natertech.com  QQ:42142951  MP:13510620050/0755-61522172
看一下 无线数传模块终极解决方案.zip (5.83 MB) ,就一切都懂了
返回列表