NRF52840学习历程(九)SPI协议0.96OLED屏幕

时间在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,操作更方便哦

 

代码解压在这里

猜你喜欢

转载自blog.csdn.net/jwdeng1995/article/details/113643388