这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » intelcmx的平衡小车DIY开发进程————NRF24L01的注意事项

共4条 1/1 1 跳转至

intelcmx的平衡小车DIY开发进程————NRF24L01的注意事项

菜鸟
2015-06-17 23:00:12     打赏



3.NRF24L01的注意事项


1.摔碎了

今天刚收到快递 三下五除二装好了 然后拨开开关  显示屏亮了  然后放置小车到地上 按主板上红色按钮 yes! 开始工作了 然后楼主是放桌上测试的 一部注意 掉地上了  尼玛  亚克力板碎了  赶紧拿起小车 赶紧关掉开关  拍拍灰 重新测试 yes! 没坏



助工
2015-06-17 23:19:29     打赏
2楼
还有一块备用的,小心折腾呀~

菜鸟
2015-08-19 15:31:02     打赏
3楼

2.重新开始

自从发了第一个帖以后就再也没有去碰小车,小车一直被我放到角落里面积灰,最近没事又想拿出来学习一下,我是新手,以前对stm32一点了解都没有,只是玩过一点51单片机。这两天在学习野火的《零死角玩转stm32-初级篇》,学完了有点小感受,在这里记录下来。

零死角玩转stm32-初级篇》的前几节介绍了环 境搭建,驱动安装和新建模板。里面是基于官方的3.5.0版库文件来讲解的,库文件的作用就是将简单粗暴繁重枯燥的寄存器操作转化成有层次、有逻辑的程序 编辑,直接操作寄存器只需要一条代码,而基于库文件可能需要5、6条甚至更多,但是能使人更加容易上手,逻辑更加清晰,大家可以找零死角玩转stm32-初级篇》来看一下,写得很好的。

端口配置

GPIO_InitTypeDef myGPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
myGPIO.GPIO_Pin=GPIO_Pin_8;
myGPIO.GPIO_Mode=GPIO_Mode_Out_PP;
myGPIO.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&myGPIO);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);


以上是配置端口8为低电平,主板上蓝色灯会亮。

要操作端口,首先要知道操作的是哪几个端口,输入还是输出,并且输入和输入还分好几种模式,还有端口速率,这些都是在初始化端口时要设置的,因为端口要初始化了才可以用,这是前提。

上面代码中 myGPIO是一个结构体变量,里面会储存端口的配置信息

myGPIO.GPIO_Pin=GPIO_Pin_8;
myGPIO.GPIO_Mode=GPIO_Mode_Out_PP;
myGPIO.GPIO_Speed=GPIO_Speed_50MHz;
这三句就是配置端口的信息。
同时还要打开端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

端口信息配置好后,就应用到端口,就是初始化端口
GPIO_Init(GPIOB,&myGPIO);

然后就可以控制端口输入/输出了
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
这是让端口输出低电平
基于系统定时器Systick的精准延时函数
流程:设置计数基数,编写中断服务函数,编写延时函数。
void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock /100000))
	{
		while(1);
	}
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

//延时函数
void Delay_us(__IO u32 nTime)
{
	TimingDelay=nTime;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
	while(TimingDelay !=0);
}
//中断服务函数 要在stm32f10x.c调用
void TimingDelay_Decrement(void)
{
	if(TimingDelay !=0x00)
	{
		TimingDelay--;
	}
}

按键的操作
按键是连接到I/O口上的,按键按下前后,端口接收到的电平是不一样的,以此来判断按钮是否按下。
端口的操作还和前面端口操作一样,只是模式要变成输入模式,然后一直扫描按键状态,按键扫描的
算法百度有
EXTI外部中断
类似按键,当检测到某GPIO口电平变化,然后执行中断任务。
大概流程:
1、选择端口 设置端口参数 输入 时钟RCC(复用开启AFIO时钟) 初始化
2、NVIC控制器的初始化 中断优先级组 初始化结构体写入参数 中断向量 抢占优先级 和响应优先级
3、EXTI初始化 指定中断输入端口 中断结构体填充 初始化
4、中断服务函数 stm32f10x_it.c

这是我这两天学习的内容,记录下来的过程相当于复习。




菜鸟
2015-08-27 16:03:55     打赏
4楼

3.关于NRF24L01

今天试着将2.4GHz通信模块连接到小车,硬件连接完毕后,下载了测试例程,嗯,连接成功。

于是我试着用野火的方法,重新写一遍驱动程序。首先新建spi_nrf.c文件,SPI的各种配置都写在里面,有初始化程序,连接检测程序,各种收发程序。

小车上NRF使用的端口是SPI1的复用端口PA5.6.7。CE.SCN使用了PB15 PB3。

这里要意PB3端口STM32F103 的 JTAG, 默认状态是Full SWJ,PB3作为JDO,被JTAG占用。我就在这个点上卡了一天左右,最后是用万用表去量各端口的电压,发现如果单纯用常规的调用库函数去设置PB3的话,PB3的电压始终是0。所以在运行检测程序的时候老是失败。解决方法是在打开GPIO口时钟后加一句 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

关闭JTAG的占用,这样就可以快乐地使用PB3了。

这是初始化程序:


void SPI_NRF_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
 // /* Enable SPI1 and GPIO clocks 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

  ///*!< SPI_FLASH_SPI Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); ///*SPI_NRF_SPI SCK,MISO,MOSI,GPIOA^5,GPIOA^6,GPIOA^7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); ///*SPI_NRF_SPI CE,GPIOA^15 SPI_NRF_SPI CSN: NSS GPIOB^3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); ///*SPI_NRF_SPI IRQ,GPIOB^4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; GPIO_Init(GPIOB, &GPIO_InitStructure); NRF_CSN_HIGH(); // /* SPI1 configuration // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK. // Data on the DO and DIO pins are clocked out on the falling edge of CLK. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); ///* Enable SPI1 SPI_Cmd(SPI1, ENABLE); }



c2是运行监测程序时向NRF的配置寄存器发送的字节,一共发送5个c2然后再从配置寄存器里面读取5个字节,如果是5个c2的话,说明连接成功


由于只有一台小车,准备用51来驱动另外一块NRF24L01来与小车通信


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]