共2条
1/1 1 跳转至页
PTR8000,LPC2210 帮我看看我的PTR8000—LPC2210程序!!!
问
各位大虾:帮我看看我的程序,我用的是LPC2210 ,读配置发送到串口,但显示的10个全是00 ,不知道哪里有问题,我也参考了hotmail 的笔记
帮我看看我的程序!
/************************905.h************************************************/
#include "config.h"
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24
/****************全部选用p0口 **********************/
#define nRF905_MOSI 0x00000040 //p0.6 mosi spi_input
#define nRF905_CSN 0x00000100 //p0.8 cs spi_select
#define nRF905_SCK 0x00000010 //p0.4 clk spi_ckock
#define nRF905_MISO 0x00000020 //p0.5 miso spi_input
#define nRF905_DR 0x00001000 //p0.12 dr spi_data_ready
#define nRF905_AM 0x00002000 //p0.13 am spi_addr_match
#define nRF905_CD 0x00000400 //p0.10 cd spi_Carrier Detect
#define nRF905_uPCLK 0x00000800 //p0.11 cs spiselect
#define nRF905_PWR_UP 0x00040000 //p0.18 power spiselect
#define nRF905_TRX_CE 0x00080000 //p0.19 Enables chip for receive and transmit
#define nRF905_TX_EN 0x00200000 //p0.21 TX_EN=”1”TX mode, TX_EN=”0”RX mode
#define nRF905_VDD 0x00400000 //p0.22
#define nRF905_CHANGE 0x02000000 //p0.25
#define nRF905_VDD (1<<22) //3.3V
#define SIZE 32 //这里不能有逗号
uint32 TxBuf[SIZE];//U0Tx,U1Rx
uint32 RxBuf[SIZE];//U0Rx,U1
/***************** spi0.h ******************/
#include "905.h"
//#include "uart0.h"
uint8 const RxBufConf[10]={0x01,0x0e,0x44,0x20,0x20,0xe7,0xe7,0xe7,0xe7,0xdf};
uint8 const RxBufConfAdd[]={0xe7,0xe7,0xe7,0xe7};
const unsigned char rfconfig[10]=
{
0x01, //CH_NO[7:0]
0x0c, //7,6:no use;5:自动重发=0;4:接收灵敏度降低=0;3,2:发射功率=10dBm;1:433MHz;CH_NO[8]=0
0x44, //7:no use;6,5,4:发送地址宽度4;3:no use;2,1,0:接收地址宽度4
0x20, //7,6 no use;5-0:接收数据宽度32
0x20, //7,6 no use;5-0:发送数据宽度32
0xcc, //接收地址字节0(设备ID)
0xcc, //接收地址字节1(设备ID)
0xcc, //接收地址字节2(设备ID)
0xcc, //接收地址字节3(设备ID)
0x58 //7:CRC模式8位;6:CRC校验许可;5,4,3:011表示16MHz;2:UP_CLK_EN=0没有外部时钟;1,0:外部时钟频率
};
void MSpi_Init(void)
{
S0PCCR=0x52;
S0PCR=0x30;//CPOL=1 SCK低有效,MSTR=1主模式,LSBF=0 SPI数据传输高位在前,IE=1硬件中断使能,但软件中断有效。
}
/************** SPI读写一体化**********/
uint8 nrf905_SpiRW(uint8 data)
{
S0PINT=0x01; //CLEAR SPI INTERRIPT VIC使能后有效
S0PDR=data;
while(0==(S0PSR&0x80));//等待SPIF值为即等待数据发送完?
return S0PDR;
}
/*********************** DelayNS() *****************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/***********************4种配置模式 *****************************************/
void nrf905_Off(void)
{
IO0CLR|= nRF905_PWR_UP;
}
void nrf905_StandBy(void)
{
IO0SET |= nRF905_PWR_UP; //Standby和SPI编程
IO0CLR |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;
}
void nrf905_TxOn(void)
{
IO0SET |= nRF905_PWR_UP; //ShockBurst TX
IO0SET |= nRF905_TRX_CE;
IO0SET |= nRF905_TX_EN;
}
void nrf905_RxOn(void)
{
IO0SET |= nRF905_PWR_UP; //ShockBurst TX
IO0SET |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;
}
/***********************Ptr8000配置 *****************************************/
void Config905(void)
{
uint8 i;
IO0SET |= nRF905_PWR_UP; //Standby和SPI编程
IO0CLR |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;//待机配置
IO0CLR=nRF905_CSN ;
nrf905_SpiRW(WC); // Write config command
for(i=0;i<10;i++)
{
nrf905_SpiRW(RxBufConf[i]);
}
IO0SET=nRF905_CSN ; // Disable Spi ;
}
/*******************测试配置程序**********/
void nrf905_SpiTest(void)
{ uint16 i;
IO0CLR |= nRF905_CSN;
nrf905_SpiRW(RC); //读配置
for(i=0;i<10;i++)
{
RxBuf[i]=nrf905_SpiRW(0);
UART0_SendByte(RxBuf[i]);//必须是字节方式发送!!!!!!
while((U0LSR&0x20)==0);
}
IO0SET |= nRF905_CSN;
/*DelayNS(10);UART0_SendStr(SEND_STRING); */
}
/***********************发送数据包子程序 *****************************************/
void TxPacket(void)//senddata
{ uint8 i;
nrf905_TxOn();//nRF905_TRX_CE 不需要为1,first because IO1 useful
IO0CLR=nRF905_CSN;
nrf905_SpiRW(WTA);
for(i=0;i<4;i++)
{nrf905_SpiRW( RxBufConfAdd[i]);
}
IO0SET=nRF905_CSN;//disable spi
DelayNS(10);
IO0CLR=nRF905_CSN;
nrf905_SpiRW(WTP);
for(i=0;i<SIZE;i++)
{
nrf905_SpiRW(TxBuf[i]);// attention TxBuf[i] should be initialize
}
IO0SET=nRF905_CSN;
IO0SET=nRF905_TRX_CE;//启动发射
DelayNS(10);
IO0CLR=nRF905_TRX_CE;
}
/*********************** 发送数据*****************************************/
void Transmitter(void)
{ uint8 i;
for (i=0;i<32;i++)
TxBuf[i]=i+i;
TxPacket();
while((IO0PIN&nRF905_DR)==0);
DelayNS(10);
nrf905_RxOn();
}
/*********************** 接收数据包子程序 *****************************************/
void RxPacket(void)
{ uint32 i;
nrf905_RxOn();
IO0CLR=nRF905_CSN;
DelayNS(650);
nrf905_SpiRW(RRP);
for(i=0;i<32;i++)//ptr8000 receice autimation
{
RxBuf[i]=nrf905_SpiRW(0);
}
IO0SET=nRF905_CSN;//disable spi
while((nRF905_DR&0x100)==1)//modify access!
{ IO0CLR=nRF905_TRX_CE;//disable spi待机接受
IO0CLR=nRF905_CSN;
for(i=0;i<32;i++)
{ if(RxBuf[i]!=(i+i));
return;
UART0_SendByte(RxBuf[i]);
}
IO0SET=nRF905_CSN;
}
DelayNS(100);
while(1)
{
UART0_SendStr(SEND_STRING);//it's okay
DelayNS(10);
}
Transmitter();//重新发回!!!
}
/***********uart0.h*********************************************************
* 文件名:SENDSTR.C
* 功能:向串口发送数据。
* 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#include "905.h"
#define UART_BPS 115200 /* 定义通讯波特率 */
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt 要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void UART0_SendStr(uint8 const *str)
{ while(1)
{ if( *str == '\0' ) break;
UART0_SendByte(*str++); // 发送数据
}
}
uint8 const SEND_STRING[] = "It's okay,Mr Hua.B!!\n";
/*********************用串口将接受的数据发送出去** *****************************************/
void UART0_SendBuf(uint8 *str)
{ uint8 i;
for(i=0;i<SIZE;i++)
UART0_SendByte(RxBuf[i]); // 发送数据 ateenation RxBuf[i]
while((U0LSR&0x20)==0);
}
/*******************主程序main.c ***************************************************/
#include "config.h"
#include "uart0.h"
#include "905.h"
#include "spi0.h"
#define BEEPCON 0x00000080; /* P0.7引脚控制B1,低电平蜂鸣 */
int main(void)
{
//uint8 i;
PINSEL0 = 0x00005505; // 设置I/O连接到UART0 spi0 其中spi 口状态未定。
IO0DIR =0xfdffc3ff; //0xffff03ff; //p0.10~p0.13 input
IO0SET=nRF905_VDD; //p0.22
UART0_Ini();
MSpi_Init();
DelayNS(100);
Config905();
nrf905_SpiTest();
/*nrf905_TxOn();//okay
TxPacket(); //it's okay!
DelayNS(50); //
nrf905_RxOn();// okay delay 1m!
RxPacket();//okay
return(0);
}
答 1: 水潭里有实战程序~~~ 答 2: 望hotpower再给予一点帮助!!谢谢!hotpower 我在测试的过程中发现 用test配置程序,读出的全部是00共 10个,而我用uart0发送字符串,显示正确,在写程序是引用了hotpower的思想和代码,及 zx1121的 笔记,再次表示感谢!最近我用io模拟时出现类同情况。在单步运行时发现MOSI电平信号变化,应该时写进去了,我在hotpower的主页上发表了我的io模拟发送程序,望hotpower给予帮助。
mail:baohua@mail.ustc.edu.cn
QQ:289734494
帮我看看我的程序!
/************************905.h************************************************/
#include "config.h"
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24
/****************全部选用p0口 **********************/
#define nRF905_MOSI 0x00000040 //p0.6 mosi spi_input
#define nRF905_CSN 0x00000100 //p0.8 cs spi_select
#define nRF905_SCK 0x00000010 //p0.4 clk spi_ckock
#define nRF905_MISO 0x00000020 //p0.5 miso spi_input
#define nRF905_DR 0x00001000 //p0.12 dr spi_data_ready
#define nRF905_AM 0x00002000 //p0.13 am spi_addr_match
#define nRF905_CD 0x00000400 //p0.10 cd spi_Carrier Detect
#define nRF905_uPCLK 0x00000800 //p0.11 cs spiselect
#define nRF905_PWR_UP 0x00040000 //p0.18 power spiselect
#define nRF905_TRX_CE 0x00080000 //p0.19 Enables chip for receive and transmit
#define nRF905_TX_EN 0x00200000 //p0.21 TX_EN=”1”TX mode, TX_EN=”0”RX mode
#define nRF905_VDD 0x00400000 //p0.22
#define nRF905_CHANGE 0x02000000 //p0.25
#define nRF905_VDD (1<<22) //3.3V
#define SIZE 32 //这里不能有逗号
uint32 TxBuf[SIZE];//U0Tx,U1Rx
uint32 RxBuf[SIZE];//U0Rx,U1
/***************** spi0.h ******************/
#include "905.h"
//#include "uart0.h"
uint8 const RxBufConf[10]={0x01,0x0e,0x44,0x20,0x20,0xe7,0xe7,0xe7,0xe7,0xdf};
uint8 const RxBufConfAdd[]={0xe7,0xe7,0xe7,0xe7};
const unsigned char rfconfig[10]=
{
0x01, //CH_NO[7:0]
0x0c, //7,6:no use;5:自动重发=0;4:接收灵敏度降低=0;3,2:发射功率=10dBm;1:433MHz;CH_NO[8]=0
0x44, //7:no use;6,5,4:发送地址宽度4;3:no use;2,1,0:接收地址宽度4
0x20, //7,6 no use;5-0:接收数据宽度32
0x20, //7,6 no use;5-0:发送数据宽度32
0xcc, //接收地址字节0(设备ID)
0xcc, //接收地址字节1(设备ID)
0xcc, //接收地址字节2(设备ID)
0xcc, //接收地址字节3(设备ID)
0x58 //7:CRC模式8位;6:CRC校验许可;5,4,3:011表示16MHz;2:UP_CLK_EN=0没有外部时钟;1,0:外部时钟频率
};
void MSpi_Init(void)
{
S0PCCR=0x52;
S0PCR=0x30;//CPOL=1 SCK低有效,MSTR=1主模式,LSBF=0 SPI数据传输高位在前,IE=1硬件中断使能,但软件中断有效。
}
/************** SPI读写一体化**********/
uint8 nrf905_SpiRW(uint8 data)
{
S0PINT=0x01; //CLEAR SPI INTERRIPT VIC使能后有效
S0PDR=data;
while(0==(S0PSR&0x80));//等待SPIF值为即等待数据发送完?
return S0PDR;
}
/*********************** DelayNS() *****************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/***********************4种配置模式 *****************************************/
void nrf905_Off(void)
{
IO0CLR|= nRF905_PWR_UP;
}
void nrf905_StandBy(void)
{
IO0SET |= nRF905_PWR_UP; //Standby和SPI编程
IO0CLR |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;
}
void nrf905_TxOn(void)
{
IO0SET |= nRF905_PWR_UP; //ShockBurst TX
IO0SET |= nRF905_TRX_CE;
IO0SET |= nRF905_TX_EN;
}
void nrf905_RxOn(void)
{
IO0SET |= nRF905_PWR_UP; //ShockBurst TX
IO0SET |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;
}
/***********************Ptr8000配置 *****************************************/
void Config905(void)
{
uint8 i;
IO0SET |= nRF905_PWR_UP; //Standby和SPI编程
IO0CLR |= nRF905_TRX_CE;
IO0CLR |= nRF905_TX_EN;//待机配置
IO0CLR=nRF905_CSN ;
nrf905_SpiRW(WC); // Write config command
for(i=0;i<10;i++)
{
nrf905_SpiRW(RxBufConf[i]);
}
IO0SET=nRF905_CSN ; // Disable Spi ;
}
/*******************测试配置程序**********/
void nrf905_SpiTest(void)
{ uint16 i;
IO0CLR |= nRF905_CSN;
nrf905_SpiRW(RC); //读配置
for(i=0;i<10;i++)
{
RxBuf[i]=nrf905_SpiRW(0);
UART0_SendByte(RxBuf[i]);//必须是字节方式发送!!!!!!
while((U0LSR&0x20)==0);
}
IO0SET |= nRF905_CSN;
/*DelayNS(10);UART0_SendStr(SEND_STRING); */
}
/***********************发送数据包子程序 *****************************************/
void TxPacket(void)//senddata
{ uint8 i;
nrf905_TxOn();//nRF905_TRX_CE 不需要为1,first because IO1 useful
IO0CLR=nRF905_CSN;
nrf905_SpiRW(WTA);
for(i=0;i<4;i++)
{nrf905_SpiRW( RxBufConfAdd[i]);
}
IO0SET=nRF905_CSN;//disable spi
DelayNS(10);
IO0CLR=nRF905_CSN;
nrf905_SpiRW(WTP);
for(i=0;i<SIZE;i++)
{
nrf905_SpiRW(TxBuf[i]);// attention TxBuf[i] should be initialize
}
IO0SET=nRF905_CSN;
IO0SET=nRF905_TRX_CE;//启动发射
DelayNS(10);
IO0CLR=nRF905_TRX_CE;
}
/*********************** 发送数据*****************************************/
void Transmitter(void)
{ uint8 i;
for (i=0;i<32;i++)
TxBuf[i]=i+i;
TxPacket();
while((IO0PIN&nRF905_DR)==0);
DelayNS(10);
nrf905_RxOn();
}
/*********************** 接收数据包子程序 *****************************************/
void RxPacket(void)
{ uint32 i;
nrf905_RxOn();
IO0CLR=nRF905_CSN;
DelayNS(650);
nrf905_SpiRW(RRP);
for(i=0;i<32;i++)//ptr8000 receice autimation
{
RxBuf[i]=nrf905_SpiRW(0);
}
IO0SET=nRF905_CSN;//disable spi
while((nRF905_DR&0x100)==1)//modify access!
{ IO0CLR=nRF905_TRX_CE;//disable spi待机接受
IO0CLR=nRF905_CSN;
for(i=0;i<32;i++)
{ if(RxBuf[i]!=(i+i));
return;
UART0_SendByte(RxBuf[i]);
}
IO0SET=nRF905_CSN;
}
DelayNS(100);
while(1)
{
UART0_SendStr(SEND_STRING);//it's okay
DelayNS(10);
}
Transmitter();//重新发回!!!
}
/***********uart0.h*********************************************************
* 文件名:SENDSTR.C
* 功能:向串口发送数据。
* 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
* 通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h"
#include "905.h"
#define UART_BPS 115200 /* 定义通讯波特率 */
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt 要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void UART0_SendStr(uint8 const *str)
{ while(1)
{ if( *str == '\0' ) break;
UART0_SendByte(*str++); // 发送数据
}
}
uint8 const SEND_STRING[] = "It's okay,Mr Hua.B!!\n";
/*********************用串口将接受的数据发送出去** *****************************************/
void UART0_SendBuf(uint8 *str)
{ uint8 i;
for(i=0;i<SIZE;i++)
UART0_SendByte(RxBuf[i]); // 发送数据 ateenation RxBuf[i]
while((U0LSR&0x20)==0);
}
/*******************主程序main.c ***************************************************/
#include "config.h"
#include "uart0.h"
#include "905.h"
#include "spi0.h"
#define BEEPCON 0x00000080; /* P0.7引脚控制B1,低电平蜂鸣 */
int main(void)
{
//uint8 i;
PINSEL0 = 0x00005505; // 设置I/O连接到UART0 spi0 其中spi 口状态未定。
IO0DIR =0xfdffc3ff; //0xffff03ff; //p0.10~p0.13 input
IO0SET=nRF905_VDD; //p0.22
UART0_Ini();
MSpi_Init();
DelayNS(100);
Config905();
nrf905_SpiTest();
/*nrf905_TxOn();//okay
TxPacket(); //it's okay!
DelayNS(50); //
nrf905_RxOn();// okay delay 1m!
RxPacket();//okay
return(0);
}
答 1: 水潭里有实战程序~~~ 答 2: 望hotpower再给予一点帮助!!谢谢!hotpower 我在测试的过程中发现 用test配置程序,读出的全部是00共 10个,而我用uart0发送字符串,显示正确,在写程序是引用了hotpower的思想和代码,及 zx1121的 笔记,再次表示感谢!最近我用io模拟时出现类同情况。在单步运行时发现MOSI电平信号变化,应该时写进去了,我在hotpower的主页上发表了我的io模拟发送程序,望hotpower给予帮助。
mail:baohua@mail.ustc.edu.cn
QQ:289734494
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |