新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2019-8-6
- 在线时间
- 3 小时
|
4金钱
背景:手里有两块开发板 精英和mini 看了几遍教程下载官方提供的例程实现了两个模块的通讯,为了检验自己的吸收情况,所以自己动手给mini开发板写一个只发送的程序,只用到LED和SPI外设,相关函数也是参考官方给的例程,精英版作为接收端用官方提供的例程未做修改,但是接收端只能收到四次数据之后就接收不到数据了,发送端也好像是发送四次就不做发送了(发送函数是在一个while(1))循环里,刚刚入门找半天找不到原因,特来求教。上代码,宏定义都是官方例程里的就不贴了
#include "nrf2401.h"
#include "delay.h"
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
void nrf2401_Init(void)/
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_SPI1,ENABLE);//初始化GPIOA、C、SPI1
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStruct.SPI_CRCPolynomial= 7;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1,ENABLE);
NRF24L01_CE=0;
NRF24L01_CSN=1;
}
void nrf2401_TxMode(void)
{
NRF24L01_CE=0;
nrf2401_WriteBuf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);
nrf2401_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);
nrf2401_WriteReg(NRF_WRITE_REG+EN_AA,0x01);
nrf2401_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
nrf2401_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
nrf2401_WriteReg(NRF_WRITE_REG+RF_CH,40);
nrf2401_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0d);
nrf2401_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);
NRF24L01_CE=0;
}
u8 SPI_WR_Byte(u8 Txdata)
{
//SPI_I2S_SendData(SPI1,Txdata);
//return SPI_I2S_ReceiveData(SPI1);
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, Txdata);
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1);
}
u8 nrf2401_WriteBuf(u8 reg,u8 *buf,u8 len)
{ u8 status,i;
NRF24L01_CSN=0;
status=SPI_WR_Byte(reg);
for(i=0;i<len;i++){
SPI_WR_Byte(*buf++);
}
NRF24L01_CSN=1;
return status;
}
u8 nrf2401_WriteReg(u8 reg,u8 value)
{
u8 status;
NRF24L01_CSN=0;
status=SPI_WR_Byte(reg);
SPI_WR_Byte(value);
NRF24L01_CSN=1;
return (status);
}
u8 nrf2401_ReadReg(u8 reg)
{
u8 reg_value;
NRF24L01_CSN=0;
SPI_WR_Byte(reg);
reg_value=SPI_WR_Byte(0xff);
NRF24L01_CSN=1;
return (reg_value);
}
u8 nrf2401_TxPackage(u8*buf)
{
u8 sta;
NRF24L01_CE=0;
nrf2401_WriteBuf(WR_TX_PLOAD,buf,TX_PLOAD_WIDTH);
NRF24L01_CE=1;
while(NRF24L01_IRQ!=0);
sta=nrf2401_ReadReg(STATUS);
nrf2401_WriteReg(NRF_WRITE_REG+STATUS,sta);
if(sta&MAX_TX){
nrf2401_WriteReg(FLUSH_TX,0xff);
return MAX_TX;
}
if(sta&TX_OK){
return TX_OK;
}
return 0xff;
}
主函数是:
#include "stm32f10x.h"
#include "nrf2401.h"
#include "delay.h"
#include "led.h"
int main (void){
u8 date[]={'g','h','g','h'};
LED_Init();
nrf2401_Init();
nrf2401_TxMode();
LED0=!LED0;
while(1){
nrf2401_TxPackage(date);
LED0=!LED0;
delay_ms(1500);
}
真心求教
|
|