找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3382|回复: 0
打印 上一主题 下一主题
收起左侧

AVR怎么读取905的数据,我这个读不到啊,spi_read();没有用

[复制链接]
跳转到指定楼层
楼主
ID:99453 发表于 2016-7-22 13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
* nrf905_reseive.c
*
* Created: 2016/7/17 11:18:37
*  Author: Knight
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define TXEN_set PORTA|=(1<<PA7)//PA7
#define TXEN_clr PORTA&=~(1<<PA7)
#define PWR_set PORTA|=(1<<PA6)
#define PWR_clr PORTA&=~(1<<PA6)
#define CE_set PORTC|=(1<<PC7)
#define CE_clr PORTC&=~(1<<PC7)
#define AM (PINC&(1<<PC6))//PC6
#define DR (PINA&(1<<PA5))//PA5
#define CSN_clr PORTB&=~(1<<PB4)
#define CSN_set PORTB|=(1<<PB4)
#define CLK_H PORTB|=(1<<PB2)
#define CLK_L PORTB&=~(1<<PB2)
#define SID_H PORTB|=(1<<PB1)
#define SID_L PORTB&=~(1<<PB1)
uint buffer[4]={0x39,0x38,0x37,0x36};
uint i;
void write_hz(uchar *hz)
{
while(*hz!='\0')
{
  write_data(*hz); //写入汉字
  hz++;
}
}
void send_byte(uchar byte)
{
uint i;
for (i=0;i<8;i++)
{
  CLK_L;//低电平
  if(byte&0x80)
  SID_H; //为1 给1
  else
  SID_L;  //为0 给0
  CLK_H;//高电平
  byte=byte<<1;
}
}
void write_com(uchar com)
{
send_byte(0xf8);//step 1
send_byte(0xf0&com);//step 2
send_byte(0xf0&(com<<4));//step 3
_delay_ms(10);
}
void write_data(uchar data)
{
send_byte(0xfa);
send_byte(0xf0&data);
send_byte(0xf0&(data<<4));
_delay_ms(10);
}
void lcd12864_init()
{
write_com(0x30);
_delay_ms(10);
write_com(0x0c);//整体和游标显示
_delay_ms(10);
write_com(0x01);
_delay_ms(10);
}
void SPI_Master_init()
{
SPCR=0x5c;//使能SPI,主机模式,2分频
SPSR=0x00;
}
void spi_write(char wData)
{
SPDR = wData;
while(!(SPSR&(1<<SPIF)));
}
uchar spi_read(void)
{
while(!(SPSR&(1<<SPIF)));
return SPDR;
}
uint TX_RF[11]={0x00,//写RF寄存器
0x4c,
0x0c,
0x44,//RXTX地址宽度
0x04,//RX32有效字节
0x04,//TX32有效字节
0xcc,
0xcc,
0xcc,
0xcc,
0x58//CRC16位效验允许
};
void nrf905_init()//RF寄存器的配置
{
PORTC&=~(1<<PC6);
PORTA&=~(1<<PA5);
PWR_set;
TXEN_set;//standby模式
CE_clr;

CSN_clr;
for(i=0;i<11;i++)
{
  spi_write(TX_RF[i]);
}
CSN_set;
}
void RX_packet()
{
TXEN_clr;//接收模式
CE_set;
_delay_us(500);
i=10;
while(!AM)//地址匹配后进入standby模式,开始接收数据
{
  i--;
  _delay_us(100);
  if(i==0)break;
}
CE_clr;//进入standby模式   !!!!!!!!!!!!!!!!!接收数据的时候是在哪个模式??

CSN_clr;
spi_write(0x24);//开始接收数据
for(i=0;i<4;i++)
{
  buffer[i]=spi_read();write_data(9);//第二波的时候停在了这里!!读905时停下
}
CSN_set;
while(!DR);//数据接收完成后置位DR
CE_clr;
}
void display()
{
for(i=0;i<4;i++)
{
  write_data(buffer[i]);
}
}
int main(void)
{
DDRA=0xc0;//DDRA|=(1<<PA6)|(1<<PA7)|(0<<PA5);
DDRC|=(1<<PC7);DDRC&=~(1<<PC6);//DDRC|=(0<<PC6)|(1<<PC7);
DDRB=0xbf;//DDRB|=(1<<PB1)|(1<<PB2)|(1<<PB4)|(1<<PB5)|(0<<PB6)|(1<<PB7);
SPI_Master_init();
lcd12864_init();
nrf905_init();
    while(1)
    {
  write_com(0x80);
  RX_packet();//停在这
  display();
    }
}
我试了下他只读出一个值就停在那了,上面的spi_read();
怎么办,大神们能看看吗
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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