搜索
bottom↓
回复: 0

ATmega16使用SPI控制NRF905无法实现功能

[复制链接]

出0入0汤圆

发表于 2013-4-11 17:29:32 | 显示全部楼层 |阅读模式
各位高手,本人想通过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, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表