完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
求高手解读一下程序,我要实现的是两个NRF905模块通信,用的STC单片机,如果是成功的,按下KEY,LED闪烁,对方接收到信号后也会跟着闪烁,用的是硬件SPI,不是模拟的。
#ifndef SPI_H #define SPI_H #include "STC89C5AS02.h" #define SSIG 1 //1: 忽略SS脚,由MSTR位决定主机还是从机 0: SS脚用于决定主从机。 #define SPEN 1 //1: 允许SPI, 0:禁止SPI,所有SPI管脚均为普通IO #define DORD 0 //1:LSB先发, 0:MSB先发 #define MSTR 1 //1:设为主机 0:设为从机 #define CPOL 1 //1: 空闲时SCLK为高电平, 0:空闲时SCLK为低电平 #define CPHA 1 // #define SPR1 0 //SPR1,SPR0 00: fosc/4, 01: fosc/16 #define SPR0 0 // 10: fosc/64, 11: fosc/128 #define SPEED_4 0 // fosc/4 #define SPEED_16 1 // fosc/16 #define SPEED_64 2 // fosc/64 #define SPEED_128 3 // fosc/128 #define SPIF 0x80 //SPI传输完成标志。写入1清0。 #define WCOL 0x40 //SPI写冲突标志。写入1清0。 void SPI_Init_Initing(); void SPI_Init_Working(void); void spi_write(unsigned char Mydata); unsigned char spi_read(void); #endif //////////////////////////////////////////////////////////////////////// #include"SPI.h" #include #include #include //---------------------------------------------------------------------------------------------------------------- #define uint unsigned int #define uchar unsigned char //---------------------------------------------------------------------------------------------------------------- //---------------------------------------------------发送数据缓冲区------------------------------------------------- #define TxRxBuf_Len 4 unsigned char TxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,}; code TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; char tf; //----------------------------------------NRF905工作模式控制端口------------------------------------------------------ ***it TXEN=P1^0; ***it TRX_CE=P1^2; ***it PWR=P1^3; //----------------------------------------LED显示端口--------------------------------------------------- ***it LED=P3^5; //----------------------------------------NRF905 数据交换端口--------------------------------------------------- ***it MISO=P1^6; ***it MOSI=P1^5; ***it SCK=P1^7; ***it CSN=P1^4; //----------------------------------------nrf905状态端口--------------------------------------------------------- ***it AM=P2^0; ***it DR=P2^1; ***it CD=P2^2; //--------------------------------------------------------------------------------------------------------------- //----------------------------------------按键端口------------------------------------------------------- ***it KEY=P3^4; //----------------------------------------nrf905控制指令------------------------------------------- #define WC 0x00 //写配置寄存器 #define RC 0x10 //读配置寄存器 #define WTP 0x20 //向TX-Payload寄存器写入发送有效数据 #define RTP 0x21 //从TX-Payload寄存器读取发送有效数据 #define WTA 0x22 //向TX-Address寄存器写入发送地址 #define RTA 0x23 //从TX-Address寄存器读取发送地址 #define RRP 0x24 //从RX-Payload寄存器读取接收到的有效数据 //------------------------------------------------NRF905寄存器配置------------------------------------------------ unsigned char idata RFConf[11]= { 0x00, //配置命令// 0x4c, //CH_NO,配置频段在430MHZ 0x0c, //输出功率为10db,不重发,节电为正常模式 0x44, //地址宽度设置,为4字节 0x04,0x04, //接收发送有效数据长度为4字节 0xCC,0xCC,0xCC,0xCC, //接收地址 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振 }; //================================================延时=========================================================== void nrf905_Delay(int n) { uint i; while(n--) for(i=0;i<80;i++); } //------------------------------------------------------初始化nRF905--------------------------------------------- void nRF905Init(void) { CSN=1; // Spi disable SCK=0; // Spi clock line init low DR=1; // Init DR for input AM=1; // Init AM for input CD=1; // Init CD for input PWR=1; // nRF905 power on TRX_CE=0; // Set nRF905 in standby mode TXEN=0; // set radio in Rx mode } //-----------------------------------------------------初始化寄存器----------------------------------------------- void Config905(void) { uchar i; CSN=0; // Spi enable for write a spi command //SpiWrite(WC); // Write config command写放配置命令 for (i=0;i<11;i++) // Write configration words 写放配置字 { spi_write(RFConf[i]); } CSN=1; // Disable Spi } //-----------------------------------------------------发送数据打包--------------------------------------------------- void TxPacket(uchar *TxRxBuf) { uchar i; //Config905(); CSN=0; spi_write(WTP); // Write payload command for (i=0;i<4;i++) { spi_write(TxRxBuf[i]); // Write 32 bytes Tx data } CSN=1; nrf905_Delay(1); // Spi disable CSN=0; // Spi enable for write a spi command spi_write(WTA); // Write address command for (i=0;i<4;i++) // 写入与对方地址一样的地址 { spi_write(TxAddress[i]); } CSN=1; // Spi disable TRX_CE=1; // Set TRX_CE high,start Tx data transmission nrf905_Delay(1); // while (DR!=1); TRX_CE=0; // Set TRX_CE low } //----------------------------------------------设置发送初始状态--------------------------------------------- void SetTxMode(void) { TRX_CE=0; TXEN=1; nrf905_Delay(1); // nrf905_Delay for mode change(>=650us) } //-----------------------------------------------设置接收初始化--------------------------------------------------- void SetRxMode(void) { TXEN=0; TRX_CE=1; nrf905_Delay(1); // nrf905_Delay for mode change(>=650us) } //----------------------------------------------------读NRF905接收数据------------------------------------------------------------ void RxPacket(void) { uchar i; nrf905_Delay(1); // TRX_CE=0; // Set nRF905 in standby mode nrf905_Delay(100); TRX_CE=0; CSN=0; // Spi enable for write a spi command nrf905_Delay(1); spi_write(RRP); for (i = 0 ;i < 4 ;i++) { TxRxBuf[i]=spi_read(); // Read data and save to buffer } CSN=1; nrf905_Delay(10); TRX_CE=1; } //--------------------------------------------------------数据接收------------------------------------------------ void RX(void) { SetRxMode(); // while (CheckDR()==0); 为了实现双向通信,就不能一直处于接收等待状态,所以注释掉 nrf905_Delay(10); RxPacket(); if(TxRxBuf[0]==0x29) { LED=0; nrf905_Delay(300); LED=1; nrf905_Delay(300);//接收到数据 后闪烁 } } /*****************************************/ /****设备初始化时对SPI配置,要求速度低****/ /*****************************************/ void SPI_Init_Initing() { SPCTL = (SSIG << 7) + (SPEN << 6) + (DORD << 5) + (MSTR << 4) + (CPOL << 3) + (CPHA << 2) + SPEED_64; } /*****************************************/ /****读写设备时对SPI配置,要求速度低******/ /*****************************************/ // 7 void SPI_Init_Working(void) { SPCTL = (SSIG << 7) + (SPEN << 6) + (DORD << 5) + (MSTR << 4) + (CPOL << 3) + (CPHA << 2) + SPEED_4; } /*********************************************** 功能:SPI发送一个字节 ***********************************************/ void spi_write(unsigned char Mydata) { SPSTAT = 0xC0; //清0 SPIF和WCOL标志 SPDAT = Mydata; //发送一个字节 while(!(SPSTAT & SPIF)) ; //等待发送完成 } /*********************************************** 功能:SPI接收一个字节的数据 ***********************************************/ unsigned char spi_read(void) { SPSTAT = 0xC0; //清0 SPIF和WCOL标志 SPDAT = 0x00; //发送一个字节 while(!(SPSTAT & SPIF)) ; //等待发送完成 return SPDAT; } //----------------------------------------------------------------------------------------------------------------- void main(void) { SPI_Init_Initing(); nRF905Init(); //初始化nRF905 Config905(); //初始化nRF905寄存器 LED=1; while(1) { SPI_Init_Working(); RX(); //数据接收 if(KEY ==0 ) { while(KEY==0); tf = 1 ; TxRxBuf[0]=0x29; } if (tf==1) { //设置发送初始状态 SetTxMode(); TxPacket(TxRxBuf); // 发送命令数据 LED=0; nrf905_Delay(300); LED=1; nrf905_Delay(300); //发送后LED闪烁 tf = 0; } } } |
|
相关推荐
7个回答
|
|
怎么给你解啊,自己对照手册看吧,有哪些地方看不懂的再来问
|
|
|
|
|
|
|
|
哪不明白,说具体点,这样怎么跟你说呀?
|
|
|
|
|
|
|
|
那就好。没看到你的确认,还以为
|
|
|
|
各位大神,我还没有调试明白,帮忙指点!!!我用的SPI模拟,但是没有信号发出,不知从何下手!!!!
|
|
|
|
我也在研究这个程序,基本上和你一样,能通讯,不过不怎么会改,我想给小车提供四路信号,你要弄会了麻烦教我下,我qq814312673
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11794 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 08:19 , Processed in 0.852041 second(s), Total 89, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号