学完了原子的SPI例程. 也通过NRF收到了我从51上发送的消息后.
我试着把51的模拟SPI搬过来试试,遇到了问题,请高人看看哪里出了问题..在这里仅贴出我认为可能存在错误的地方. NRF地址那些都是ok的
/*模拟SPI端口输出输入定义*/
#define CE_H GPIOG->BSRRL = GPIO_Pin_2
#define CE_L GPIOG->BSRRH = GPIO_Pin_2
#define CSN_H GPIOG->BSRRL = GPIO_Pin_3
#define CSN_L GPIOG->BSRRH = GPIO_Pin_3
#define SCK_H GPIOG->BSRRL = GPIO_Pin_4
#define SCK_L GPIOG->BSRRH = GPIO_Pin_4
#define MOSI_H GPIOG->BSRRL = GPIO_Pin_5
#define MOSI_L GPIOG->BSRRH = GPIO_Pin_5
#define MISO_H GPIOG->BSRRL = GPIO_Pin_6
#define MISO_L GPIOG->BSRRH = GPIO_Pin_6
#define IRQ_H GPIOG->BSRRL = GPIO_Pin_7
#define IRQ_L GPIOG->BSRRH = GPIO_Pin_7
#define MOSI_read GPIOG->IDR & GPIO_Pin_5
#define MISO_read GPIOG->IDR & GPIO_Pin_6
/****************************************************************************************
NRF24L01引脚口初始化
***************************************************************************************/
void NRF_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
/****************************************************************************************
NRF24L01初始化
***************************************************************************************/
void init_NRF24L01(void)
{
CE_L; // chip enable
CSN_H; // Spi disable
SCK_L; //
SPI_Write_Buf(NRF_WRITE_REG + TX_ADDR, (u8*)TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, (u8*)RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(NRF_WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(NRF_WRITE_REG + RF_CH, 0x6e); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(NRF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(NRF_WRITE_REG + RF_SETUP, 0x27); //设置发射速率为1MB/S,发射功率为最大值+7dB,由于有X2401L功放,实际+21dbm输出
}
/****************************************************************************************************
函数:void SetRX_Mode(void)
功能:数据接收配置
****************************************************************************************************/
void SetRX_Mode(void)
{
CE_L;
SPI_RW_Reg(NRF_WRITE_REG + CONFIG2, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE_H;
}
/****************************************************************************************************
函数:uint SPI_RW(uint uchar)
功能:NRF24L01的SPI写时序
***************************************************************************************************/
unsigned char SPI_RW(unsigned char ucharb)
{
unsigned char bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit 输出8位数据
{
if(ucharb & 0x80) // output 'uchar', MSB to MOSI 主机输出从机输入
{
MOSI_H;
}
else
{
MOSI_L;
}
ucharb = (ucharb << 1); // shift next bit into MSB.. 数据移动左移
SCK_H; // Set SCK high..
delay_us(12);
if(MISO_read)
{
ucharb |= 0x01; // capture current MISO bit 读MISO到 dat 最低位
}
else
{
ucharb |= 0x00;
}
delay_us(12);
SCK_L; // ..then set SCK low again
}
return(ucharb); // return read uchar
}
我弄了没反应后,加了原子的
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址
for(i=0;i<5;i++)if(buf!=0XA5)break;
if(i!=5)return 1;//检测24L01错误
return 0; //检测到24L01
}
在usart输出上,这个一直都是输出1 检测错误....... 我感觉是不是MISO或者是SPI_RW哪里弄错了,感觉——》IDR那个也是可以的...求大神帮看看
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2.SPI两个数据线一发一收,为何定义了两个读管脚,看看读用到的管脚定义是否正确
3.检查SPI时序
先搞定SPI_RW_Reg函数再做下一步调试
一周热门 更多>