|
各位高手,本人想通过ATmega16的SPI与NRF905进行通信,可惜这程序调了几天了,一直不知道哪里出问题,本人用51也编过也不成功,叫同学验证过nrf905模块还可以正常工作,发送端与接收端都不成功(通过检测DR是否为高电平),烦啊,编译没出现错误,也接3.3V了,谢谢帮忙啊
//ICC-AVR application builder : 2007-8-11 20:37:32
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "nRF905TRX.h"
//---------------------------------发送数据-------------------------------------
extern unsigned char TxRxBuffer[4];
//----------------------------------接收地址------------------------------------
unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc };
//------------------------------------------------------------------------------
uchar count1 ,count2;
//----------------------------------寄存器配置----------------------------------
unsigned char RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在430MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//----------------------------------100us延时子程序-----------------------------
void Delay(uint x)
{
uint i;
while(x--)
for(i=0;i<80;i++);
}
//----------------------------------SPI初始化-----------------------------------
void Spi_initial(void)
{
SPCR = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0);// 主机模式,fck/16, SPI方式0
}
//---------------------------------SPI读写程序----------------------------------
uchar SpiReadSpiWrite(unsigned char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF) )) // 等待SPI发送完毕
{};
return SPDR;
}
//--------------------------------系统状态初始化--------------------------------
void system_Init(void)
{
//------NRF905的IO口设置----------------------------------------------------
DDRB|=0XB3;//1011 ?011 SCK MISO MOSI CSN ? CD PWR TXEN
DDRD|=0X04;//???? ?100 ? ? ? ? ? CE DR AM
//--------------------------------------------------------------------------
Hign_nrf905_CSN; // SPI使能
Low_nrf905_SCK;
Low_nrf905_DR; // DR=0
Low_nrf905_AM; // AM=0
Low_nrf905_CD; // CD=0
Hign_nrf905_PWR; // PWR=1
Low_nrf905_TRX_CE; // nrf905_TRX_CE=0
Low_nrf905_TX_EN ; // nrf905_TX_EN=0
}
//--------------------------------NRF905寄存器初始化函数------------------------
void Config905(void)
{
uchar i;
Low_nrf905_CSN; //SPI使能
Delay(10);
for (i=0;i<11;i++) //碞RF905配置字
{
SpiReadSpiWrite(RFConf[i]);
}
Hign_nrf905_CSN; // Disable Spi
}
//--------------------------------NRF905待发数据打包----------------------------
void TxPacket(void)
{
uchar i;
Low_nrf905_CSN; // 使能Spi,允许对nrf905进行读写操作
Delay(5);
SpiReadSpiWrite(WTP); // 写数据前先写写数据命令
for (i=0;i<32;i++)
{
SpiReadSpiWrite(TxRxBuffer[i]); // 待发送的32字节数据
}
Hign_nrf905_CSN;
Delay(10); // 关闭Spi,不允许对nrf905进行读写操作
Low_nrf905_CSN; // 使能Spi
SpiReadSpiWrite(WTA); // 写地址前首先先写地址命令
for (i=0;i<4;i++) // 写入4 bytes 接收地址
{
SpiReadSpiWrite(TxAddress[i]);
}
Hign_nrf905_CSN; // 关闭Spi
Hign_nrf905_TRX_CE; // Set TRX_CE high,start Tx data transmission
Delay(5); // 等待DR变高
while (CheckDR()==0); //等待接收完成
Low_nrf905_TRX_CE; // 设置TRX_CE=0
}
//------------------------------设置发送模式------------------------------------
void SetTxMode(void)
{
Low_nrf905_TRX_CE; //
Hign_nrf905_TX_EN; //发送使能
DelayMS(2); // delay for mode change(>=650us)
}
//------------------------------设置接收模式激发--------------------------------
void SetRxMode(void)
{
Low_nrf905_TX_EN;
Hign_nrf905_TRX_CE;
DelayMS(3); // delay for mode change(>=650us)
}
//------------------------------发送数据----------------------------------------
void TX(void)
{
SetTxMode(); // Set nRF905 in Tx mode
TxPacket(); // Send data by nRF905
}
//-----------------------------判断是否收到数据---------------------------------
unsigned char CheckDR(void) //检查是否有新数据传入
{
if (PIND & (1 << PD1))
{
return 1; //收到数据
}
else
{
return 0;
}
}
//-----------------------------------读接收数据包-------------------------------
void RxPacket(void) //读数据
{
uchar i;
Low_nrf905_TRX_CE;
Low_nrf905_CSN; // 使能SPI
Delay(1);
SpiReadSpiWrite(RRP); // 写入数据接收缓冲区数据命令
for (i = 0 ;i < 4 ;i++)
{
TxRxBuffer[i]=SpiReadSpiWrite(0); // 读取数据接收缓冲区数据
}
Hign_nrf905_CSN;
Delay(2); //
Hign_nrf905_TRX_CE;
}
//--------------------------------设置接收模式----------------------------------
void RX(void)
{
SetRxMode(); //设置NRF905接收模式
while (CheckDR()==0); //等待接收完成
DisplayOneChar(1,1,'b');
RxPacket(); //读取接收数据缓冲区
Delay(10);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|