一起学nRF51xx 7 -  spi

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

SPI 总线是 Motorola 公司推出的三线同步接口, 以同步串行 3 线方式进行通信。 SPI 接口有 4 条信号线: SCK, MOSI, MISO, SCS。 SPI 总线支持一主多从通讯, SCS 用来选择要通讯的SPI 外设, 低电平有效。 在 SCK 的驱动下, 主跟指定的从进行全双工、 同步串行通讯。 SPI 总线中有几个比较重要的概念, 我们先看一下:

 

1) CPOL(CLOCK POLARITY)

时钟极性。 SPI 的 CPOL, 表示当 SCLK 空闲, 即 idle 的时候, 其电平的值是低电平 0 还是高电平 1。

CPOL=0, 时钟空闲 idle 时候的电平是低电平, 当 SCLK 有效的时候, 高电平, 就是所谓的active-high;

CPOL=1, 时钟空闲 idle 时候的电平是高电平, 当 SCLK 有效的时候, 低电平, 就是所谓的active-low;

 

2)Edge边沿。 即时钟电平变化的时刻, 即上升沿(rising edge)或者下降沿(falling edge)。 对于一个时钟周期内, 有两个 edge。 分别称为:

 

A) Leading edge

前一个边沿=第一个边沿, 如果开始电压是 1, 那么就是 1 变成 0 的时候; 如果开始电压是 0, 那么就是 0 变成 1 的时候.

B) Trailing edge

后一个边沿=第二个边沿, 如果开始电压是 1, 那么就是 0 变成 1 的时候(即在第一次 1变成 0 之后, 才可能有后面的 0 变成 1) ; 如果开始电压是 0, 那么就是 1 变成 0 的时候。

 

3)CPHA(CLOCK PHYSE )

时钟相位。 它表示的是在第几个时钟有效沿采集数据。 当 CPHA=0, 在第一个边沿采集数据; 当 CPHA=1, 在时钟的第二个边沿采集数据。

 

CPHA=0, 表示第一个边沿:

对于 CPOL=0, idle 时候的是低电平, 第一个边沿就是从低变到高, 所以是上升沿;

对于 CPOL=1, idle 时候的是高电平, 第一个边沿就是从高变到低, 所以是下降沿;

 

CPHA=1, 表示第二个边沿:

对于 CPOL=0, idle 时候的是低电平, 第二个边沿就是从高变到低, 所以是下降沿;

对于 CPOL=1, idle 时候的是高电平, 第一个边沿就是从低变到高, 所以是上升沿;

 

本节将在NRF51822芯片是使用SPI接口实现对板上FLASH芯片GD25Q128的读写操作。

 

示例详解

基于硬件平台:nrf51822ek_tm开发板。

 

 

本示例所用的最小系统板原理图:

 

 

    1. 工程创建:
      1. 打开KEIL,新建一个空工程:Project->NewuVisionProject

工程名为nrfxx-spi确认后按下图选择芯片为nrf51822_xxAA->ok

在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51Series字样的);在nrf_device中勾选nrf_gpio,nrf_gpiote,nrf_delay,nrf_ppi,nrf_error,nrf_uart,nrf_spi.h并在nrf_Libraries中勾选app_error,nrf_assert模块。

 

 

OK之后工程自动生成如下代码:

新建一个空白文档,保存为main.c,并加入工程中:

配置工程,选择使用MicroLIB库,可以减小程序体积:

加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:

 

调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:

 

加入事先写好的GD25Q128B驱动程序(该程序是在兆易官方库基础上修改得到),并将对应的头文件路径加入到工程中。

 

    1. 工程代码
      1. OK之后在man.c中加入如下代码:

其中spi_flash_init,spi_flash_buffer_write,spi_flash_buffer_read三个函数实现在GD25qxx.c文件中,spi_flash_init主要是完成SPI接口的初始化工作:

在GD25qxx.c除了spi_flash_init需要修改外,还需要对spi_flash_send_byte和spi_flash_send_halfword两个函数进行修改:

当然,在GD25qxx.h也要进行一些必要修改:

最后本示例使用了MicroLib库,同时又使用了较大同间的局部变量,如MAIN函数中的uint8_t Txbuff[1024],uint8_t Rxbuff[1024],为了保证本示例功能正常需加大堆栈大小,如下图设置为4096(4K)字节:

 

完成以上操作就可以通过NRFXX的SPI接口实现对GD25Q128B Flash芯片的读取操作了。关于nrfxx接口的更多介绍可以去网官https://infocenter.nordicsemi.com/index.jsp 查看相应的接口说明文档。

 

    1. 将开发板上的串口端口与电脑连接,打开PC上串口调试助手(串口驱动已成功安装),打开对应的串口,编译工程,下载程序,可以看到开发板的蓝灯实现了500ms亮500ms灭循环效果,同时串口成功输出以下数据:

通过上面的打印的数据可以发现,通过SPI接口成功实现了对GD25Q128的读写操作,用逻辑分析仪可以抓取到正常的SPI数据。

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|一起学nRF51xx 7

 

关注十三公众号

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值