打印
[STC单片机]

2.4g无线模块程序求助

[复制链接]
1070|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
long2022|  楼主 | 2016-4-18 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按网上的教程写2.4g无线模块的程序,测试各函数功能时,读写只有一个数据的寄存器时返回值正常,但按网上的的方法写的读有多位数据的寄存器时就读不出来的,我找了好几个例程,基本都是类似写法啊,按程序上返回值是07 00 00 00 00 00 ,前面07正常,后面的几个0全是默认值啊,正常应该是e7e7e7e7e7e7来着,帮忙给看看那里出错了蓝字部分是读写多个字节的程序,谢谢了
#include <STC15W4K60S2.h>
#include <intrins.h>
sbit csn=P5^5;
sbit ce=P5^4;
sbit irq=P3^2;
unsigned char status;
void UartInit(void)  //115200bps@22MHz
  {
   SCON = 0x50;  //8位数据,可变波特率
   AUXR |= 0x40;  //定时器1时钟为Fosc,即1T
   AUXR &= 0xFE;  //串口1选择定时器1为波特率发生器
   TMOD &= 0x0F;  //设定定时器1为16位自动重装方式
   TL1 = 0xD0;  //设定定时初值
   TH1 = 0xFF;  //设定定时初值
   ET1 = 0;  //禁止定时器1中断
   TR1 = 1;  //启动定时器1
  }
void Delay()  //10微秒@22.1184MHz
{
unsigned char i;

_nop_();
_nop_();
_nop_();
i = 52;
while (--i);
}
void Delay100us()  //@22.1184MHz
{
unsigned char i, j;

i = 3;
j = 35;
do
{
  while (--j);
} while (--i);
}


void spiInit(void)
  {
   SPCTL=0xd3;//spi功能设置
   SPSTAT |= 0XC0;//写1清0两个标记位
   IE2&=0;
  }
/*******************************************/
/*           spi写入/读取程序              */
/*******************************************/
unsigned char spi_rw(unsigned char tr_data)
{
unsigned char i=0;

SPSTAT |= 0Xc0; // 清高两位,
SPDAT=tr_data;
while(((SPSTAT&0X80)!=0X80)&&(i<20))
{
  i++;
// Delay();
}
return SPDAT;
}
     
/******************************************/
/*            用spi读一个寄存器字节       */
/*****************************************/
unsigned char spi_read(unsigned char reg)//reg 是寄存器地址
  {
   unsigned char reg_zhi;
   csn=0;
   spi_rw(reg);  //reg指令
   reg_zhi=spi_rw(0);//读reg值到reg_zhi
   csn=1;
   return reg_zhi;
  }
/********************************************/
/*         写一个字节到寄存器                */
/********************************************/
unsigned char spi_rw_reg(unsigned char reg ,unsigned char zhi)
  {
   unsigned char status;
   csn=0;
   status=spi_rw(reg);//写指令并读status
   spi_rw(zhi);//写值到reg寄存器
   csn=1;
   return status;
  }
/*************************************************/
/*              从寄存器读多个字节
/*    reg 是寄存器地址,*pbuf是待读数据的地址? */
/*        geshu是读出数据的个数?                  */
/*************************************************/
unsigned char spi_read_buf(unsigned char reg,unsigned char *pbuf, unsigned char geshu)
  {
   unsigned char status, i;
   csn=0;
   status=spi_rw(reg);
   for(i=0;i<geshu;i++);
   pbuf=spi_rw(0);
   csn=1;
   return status;
  }
/***********************************************************/
/*              向寄存器写入多个字节                        */
/* reg 是寄存器地址,*pbuf是数据要写入的地方geshu是数据的个数*/
/**********************************************************/
unsigned char spi_write_buf(unsigned char reg,unsigned char *pbuf,unsigned char geshu)
  {
   unsigned char status,i;
   csn=0;
   status=spi_rw(reg);
   for(i=0;i<geshu;i++);
   spi_rw(*pbuf++);
   csn=1;
   return status;
  }


/*************************************************/
/*                 主程序                        */
/*************************************************/
void main()
  {
      unsigned char addr[5]={0,0,0,0,0,};
   
   ce=0;
   csn=0;
   irq=1;
   status=0;
   UartInit();
   spiInit();
   Delay();
   while(1)
    {
     if(RI)
      {  
       spi_rw_reg(0x35,0x7);
      
       status=spi_read(0x15);//读寄存器0x0的值
       SBUF=status;
       TI=0;
      
       Delay100us();
      
       spi_read_buf(0x10,addr,5);//读寄存器0x10(发射地址寄存器的内容)地址是5个字节
       Delay100us();
       SBUF=addr[0];
       Delay100us();
       SBUF=addr[1];
       Delay100us();
       SBUF=addr[2];
       Delay100us();
       SBUF=addr[3];
       Delay100us();
       SBUF=addr[4];         
        
       RI=0;
      }
    }
  }

相关帖子

沙发
zhxzhxzzhhxx| | 2016-4-19 18:32 | 只看该作者
多字节读的时候,不要每个字节都动CSN

使用特权

评论回复
板凳
long2022|  楼主 | 2016-4-19 22:01 | 只看该作者
zhxzhxzzhhxx 发表于 2016-4-19 18:32
多字节读的时候,不要每个字节都动CSN

for的下一句没加{}所以csn不在循环里啊

使用特权

评论回复
地板
long2022|  楼主 | 2016-4-19 22:02 | 只看该作者
哦,找到问题了,for后面不应该加引号

使用特权

评论回复
5
zhxzhxzzhhxx| | 2016-5-19 19:35 | 只看该作者
long2022 发表于 2016-4-19 22:01
for的下一句没加{}所以csn不在循环里啊

for(i=0;i<geshu;i++);
那你这个分号就是错的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

14

帖子

1

粉丝