时间在2021年2月4日,寒假放假在家好好学一学nRF52840
今天还在感冒,休息一波
开发板:初雪的100出头那块 NRF52840 EVAL KIT
下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器诸如STLINK,DAP不建议用)
版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0
参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图)
nRF5_SDK_17.0.2_d674dde(官方例程)
nRF5_SDK_17.0.0_offline_doc(官方文档)
nRF52840_PS_v1.1.pdf(官方数据手册)
代码太长, 先放效果图
-------------------------------------------------------------------
SPI介绍
SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU 与各种外围设备以串行方式进行通信以交换信息。
SPI 总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用 4 条线:串行时钟线(SCLK)、主机输入/从机输出数据线 MISO、主机输出/从机输入数据线 MOSI 和低电平有效的从机选择线 SS(有的 SPI 接口芯片带有中断信号线 INT、有的 SPI 接口芯片没有主机输出/从机输入数据线 MOSI)。
低功耗时:
当系统处于低功耗且不需要外围设备时,通过停止然后禁用外围设备可以实现最低功耗。可能并不总是需要 STOP 任务(外设可能已经停止),但如果发送,软件应等到收到 STOPPED事件作为响应,然后通过 ENABLE 寄存器禁用外设。
-------------------------------------------------------------------
现在实验为SPI模式的0.96OLED
连接的SPI_0.96OLED的IO引脚为
D0(CLK) -> 12
D1(SDA) -> 23
RES -> 7
DC -> 21
CS -> 19
另外其他已经用到的引脚为
按键
KEY0 ->11
KEY1 ->24
KEY2 ->20
KEY3->17
LED
LED0 ->13
LED1->14
LED2->32+9=41
LED3->16
串口
TX ->6
RX ->8
ADC
光敏 -> 5
摇杆X -> 28
摇杆Y -> 29
IIC_0.96OLED
SDA -> 32
SCL -> 22
添加SPI驱动文件
具体在
..\..\..\..\..\..\modules\nrfx\drivers\src\nrfx_spi.c
..\..\..\..\..\..\integration\nrfx\legacy\nrf_drv_spis.c
添加SKD_CONFIG配置
添加SPI OLED的驱动文件
都是复制别人的 我这边修改下就用了
然后编译就报错了
.\_build\nrf52840_xxaa.axf: Error: L6200E: Symbol SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler multiply defined (by nrfx_spim.o and nrfx_twi.o).
查了下,原来是SPI地址与TWI(IIC)地址相同,我这边用了TWI0,所以就不能使用SPI0了,故用SPI1
顺便把别人的SPI OLED代码加入
编译有错, 把 nrf_drv_spis.c删掉即可
1代码修改地方(spi.h)
CS为19
DAT(MOSI)为23
SCK为12
没有MISO
使用SPI1,而不是SPI0(因为用了TWI0(IIC0),所以SPI只能用1 或2)
#define SPI_INSTANCE 1 //使用SPI 1
2代码修改(ssd1306.h)
DC为21
RST为7
3代码修改(spi.c)
不需要MISO,因为没有交互,只有MCU控制屏幕, 没有没有控制或传数据到MCU中
Main.c代码 , 注意 ,这边spi使用了缓存,把画布写好之后,调用 OLED_Refresh_Gram() 把内容传到屏幕上
SPI_INIT();
SPI_OLED_Init();
OLED_ShowString(10, 0, "0.96inch OLED", 16);
OLED_ShowString(0, 16, "This is a demo for SSD1306/1106 OLED moudle!", 16);
OLED_Refresh_Gram();
nrf_delay_ms(3000);
OLED_Clear();
OLED_Draw_Bitmap(0, 2, &c_chSingal816[0], 16, 8);
OLED_Draw_Bitmap(24, 2, &c_chBluetooth88[0], 8, 8);
OLED_Draw_Bitmap(40, 2, &c_chMsg816[0], 16, 8);
OLED_Draw_Bitmap(64, 2, &c_chGPRS88[0], 8, 8);
OLED_Draw_Bitmap(90, 2, &c_chAlarm88[0], 8, 8);
OLED_Draw_Bitmap(112, 2, &c_chBat816[0], 16, 8);
OLED_Show_3216_Char(0,16, '2',1);
OLED_Show_3216_Char(16,16, '3',1);
OLED_Show_3216_Char(32,16, ':',1);
OLED_Show_3216_Char(48,16, '5',1);
OLED_Show_3216_Char(64,16, '6',1);
OLED_Show_1616_Char(80,32, ':',1);
OLED_Show_1616_Char(96,32, '4',1);
OLED_Show_1616_Char(112,32, '7',1);
OLED_Draw_Bitmap(87, 16, &c_chBmp4016[0], 40, 16);
OLED_ShowString(0, 52, "MUSIC", 12);
OLED_ShowString(52, 52, "MENU", 12);
OLED_ShowString(98, 52, "PHONE", 12);
OLED_Refresh_Gram();
while(1)
{
// printf("hello world! \r\n");
}
链接:https://pan.baidu.com/s/1c8xX9h90On1z28O15NV4_w
提取码:s0k2
复制这段内容后打开百度网盘手机App,操作更方便哦
代码解压在这里