📄 使用lpc2131对nrf905进行配置通信.txt
字号:
21ICBBS讨论
阅读帖子
请教nRF905配置程序是否正确(HotPower,汽车老大,圈圈帮忙)
ZX1221 发表于 2006-5-19 10:00 ZLG-ARM ←返回版面
使用LPC2131对nRF905进行配置通信,spi连接,串口显示配置!用示波器测试ARM
MOSI脚有数据发送,就是配置数据已经传送过去。但是读配置全部显示10个FF,没有配置进去!请教程序是否正确?
头文件用的HOTPOWER的,所以没贴上。
/*LPC2131控制nRF905无线芯片程序,使用SPI配置并通信
版本:1.0
*/
#include "config.h"
#include "nrf905.h"
#include <stdio.h>
#define nRF905_PWR_UP (1<<18) //IO1 P1.18
#define nRF905_TRX_CE (1<<17) //IO1 P1.17
#define nRF905_TX_EN (1<<16) //IO1 P1.16
#define nRF905_CD (1<<21) //IO1 P1.21
#define nRF905_AM (1<<22) //IO1 P1.22
#define nRF905_DR (1<<19) //IO1
P1.19做input检测dr信号(可以做外部中断2)
#define nRF905_SCK (1<<4) //IO0 P0.4
#define nRF905_MISO (1<<5) //IO0 P0.5
#define nRF905_MOSI (1<<6) //IO0 P0.6
#define nRF905_CSN (1<<20) //IO1 P1.20
#define MASTER //编译控制是主机还是从机
#define UART_BPS0 9600 // 通讯波特率2400
#define BufferSize 32
uint8 Buffer1[BufferSize]; //U0Rx,U1Tx
uint8 Buffer2[BufferSize]; //U0Tx,U1Rx
const uint32 LED6 = (1 << 23); // P1.18控制LED1,低电平点亮
const uint32 LED7 = (1 << 24); // P1.18控制LED1,低电平点亮
const uint32 LED8 = (1 << 25); // P1.18控制LED1,低电平点亮
volatile uint8 rcv_new;
uint8 ch,ch1;
uint8 flagtext[]="send
data123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF...";
void WDT_INIT(void);
void WDT_CLEAR(void);
void __irq IRQ_UART0(void);
void UART_Init (void);
void UART0_SendByte (uint8 data);
void UART0_SendBuf ( char *str) ;
void MSPI_Init(void);
uint8 nrf905_SpiRW(uint8 data);
void nrf905_SPISendStr (uint8 *str);
void nrf905_SpiTest(void);
void Config905(void);
void nrf905_ReadData(void);
void nrf905_SendData(void);
void Receiver(void);
void Transmitter(void);
void nrf905_Off(void);
void nrf905_StandBy(void);
void nrf905_TxOn(void);
void nrf905_RxOn(void);
void WDT_INIT(void)
{
while(( WDMOD & 0x04 ) == 0x04) // 判断看门狗超时标志
WDMOD = 0x00;
/* 初始化看门狗 */
WDTC = 0xffffff; // 设置看门狗定时器参数
WDMOD = 0x01; // 看门狗中断使能
WDFEED = 0xAA; // 第一次喂狗启动WDT
WDFEED = 0x55;
}
void WDT_CLEAR(void)
{
IRQDisable(); //喂狗之前关中断
WDFEED = 0xAA; //第一次喂狗启动WDT
WDFEED = 0x55;
IRQEnable(); //喂狗之后IRQ中断使能
}
void __irq IRQ_UART0(void) //串口0接收中断
{
uint8 i;
if((U0IIR&0x0f)==0x04)
rcv_new = 1;
for(i=0;i<BufferSize;i++)
{
Buffer1[i]=U0RBR;
}
VICVectAddr = 0x00;
}
void UART_Init (void)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & 0xFFF0FFF0) | 0x05|(0x05<<16); //
设置I/O连接到UART
U0LCR = 0x83; // DLAB=1,允许设置波特率
U1LCR = 0x83;
Fdiv = (Fpclk / 16) / UART_BPS0; // 设置U0波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
/* 使能UART0中断 */
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ
slot0,即最高优先级
VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 1 << 0x06; // 使能UART0中断
}
void UART0_SendByte (uint8 data) //串口0发送数据
{
U0THR = data;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
void UART0_SendBuf ( char *str) //串口0发送字符串
{
uint8 i;
for(i=0;i<BufferSize;i++)
UART0_SendByte(Buffer1[i]); // 发送数据
while((U0LSR&0x20) == 0);
}
//SPI中断服务函数
void __irq SPI_IRQ(void)
{
uint32 tmp;
volatile uint8 RcvData; // 接收到的数据
volatile uint8 RcvFlag; // 接收到新数据标志
tmp = S0PSR; //
SPI读取数据寄存器之前,必须先读SPSR寄存器,清零SPIF位。
RcvData = S0PDR; // 接收数据
RcvFlag = 0x01; // 接收到新数据
S0PINT = 0x01; // 清除标志位
VICVectAddr = 0x00;
}
void MSPI_Init(void)
{
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;// 设置管脚连接SPI
IO0DIR |= 0xd0;
S0PCCR = 0x52; // 设置SPI时钟分频
S0PCR = (0 << 3) | // CPHA = 0, 数据在SCK
的第一个时钟沿采样
(0 << 4) | // CPOL = 0, SCK 为高有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB
(位7)在先
(0 << 7); // SPIE = 1, SPI 中断使能
VICIntSelect = 0x00000000; // 设置所有中断为IRQ
VICVectCntl0 = (0x20 | 10); // SPI中断为最高优先级
VICVectAddr0 = (int32)SPI_IRQ; // 设置中断向量地址
VICIntEnable = (1 << 10); // 允许SPI中断
delay(10);
}
//SPI读写一体化函数
uint8 nrf905_SpiRW(uint8 data)
{
//uint8 temp;
S0PINT = 0x01; // Clear SPI interrupt
S0PDR = data;
while( 0 == (S0PSR & 0x80));
return S0PDR;
}
void nrf905_SPISendStr (uint8 *str) //SPI0发送字符串
{
while (1)
{
if (*str == '\0') break; // 遇到结束符,退出
nrf905_SpiRW(*str++) ; // 发送数据
}
}
//测试:通过读配置,判断SPI操作是否正确
void nrf905_SpiTest(void)
{
uint8 i;
IO0CLR |= nRF905_CSN;
nrf905_SpiRW(RC); //读配置
for (i=0;i<10;i++)
{
Buffer2[i]= nrf905_SpiRW(0);//read from nrf905
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -