关于利用AVR硬件SPI驱动NRF905的问题
各位大神,本人是一名在读大学生,自学的AVR。最近正在用nrf做一个项目,但是遇到了一个瓶颈,经过两个星期的修改和上网查资料还是没能解决。
具体问题如下:
我利用AVR自带的硬件SPI引脚来向nrf905写入数据时,始终无法写入配置信息(利用示波器测经过初始化之后的nrf的VCLK引脚一直输出的是频率为400KHZ的波);后来实在没办法,用IO口模拟的SPI对nrf905进行操作,居然成功了。稀里糊涂的 。
下面是我写硬件SPI的初始化部分的程序,请大神抽空帮我看一下,为什么我用硬件SPI驱不起来?
相关引脚连接如下:
CD--------------PD2
AM-------------PD3
DR-----------------PD4
CE-----------------PD5
PWR--------------PD6
TWEN-------------PD7
CS-----------------PB4(ss)
MISO--------------PB(MISO)
SCK-----------------PB7(SCK)
MOSI--------------PB(MOSI)
#include <asf.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
//*******************定义命令字**********************
#define WC 0x00 // 写配置命令
#define RC 0x10 // 读配置命令
#define WTP 0x20 // 写发送命令。
#define RTP 0x21 //读发送命令
#define WTA 0x22 // 写发送地址
#define RTA 0x23
#define RRP 0x24
uchar Rfconfig[10]={0x4c/*433.3MHZ*/,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};//nrf905初始化
void spi_init(void)
{
//配置相应的寄存器
SPCR = 0x5f; //0b0101 1111
SPSR = 0x00; //SPI2x=0
}
void spi_write(uint data) //data占一个字节(8位)
{
PORTB &= ~(1 << 4); //使能spi器件(ss引脚拉低,启动通讯)
SPDR=data; //发送数据
while(!(SPSR & (1<<SPIF))); //等待发送完毕
PORTB |= (1 << 4); //禁止spi器件*/
}
void ini_system(void)
{
DDRB=0b10111111;
PORTB=0b01111111;
DDRD=0xe3;//1110 0011
PORTD=0x5f;//0101 1111
spi_init();
spi_write(WC);//写配置命令
for(uchar i=0;i<10;i++)
{
spi_write(Rfconfig);
}
}
void main()
{
board_init();
ini_system();
while(1)
{
}
}
|