首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | 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的驱动程序,只是更改了使能管脚定义,为什么接收不到数据呢?


各位,加油啊
各位高手请指点一下呀!
各位,加油啊
返回列表