在线时间7266 小时
UID3426478
注册时间2017-9-25
NXP金币5384
TA的每日心情 | 擦汗 昨天 15:50 |
---|
签到天数: 1874 天 连续签到: 5 天 [LV.Master]伴坛终老
超级版主
 
- 积分
- 112714
- 最后登录
- 2025-8-31
|
本帖最后由 stm1024 于 2019-8-21 16:24 编辑
最近其实一直挺忙的,但是也不敢落下学习,有空的时候还是玩一下开发板,昨天晚上试了一下SPI外设,和大家分享一下。
对于经常搞开发的研发攻城狮,SPI肯定不陌生了,在之前LPC11系列上,有SSP接口可以实现多种协议接口,其中SPI就可以使用SSP实现,在此之前,我也写过类似的帖子,详见:【LPC11U68】15. SSP:SPI模式,此处不再啰嗦。
这次和大家讨论的是原生的SPI外设,也就说,是LPC17xx系列上的专用SPI外设,主要内容是参考了UM10360中的Chapter 17: LPC176x/5x SPI,对着手册,从0行代码完全整出一个的简单功能的SPI模块。
1. 针脚配置
这个没啥好讲的,其实对着文档上的步骤一步一步来就行,NXP家这点非常好,就是文档描述和芯片行为完全一致,先上代码:
- void XDSPI_Config(void)
- {
- //PIN Config
- LPC_SC->PCONP|=(1UL<<8);//set bit PCSPI
- LPC_SC->PCLKSEL0|=(3UL<<16);// PCLK=CCLK/8
- //P0.15 for SCK
- LPC_PINCON->PINSEL0|=(3UL<<30);
- //P0.16 for SSEL
- //P0.17 for MISO
- //P0.18 for MOSI
- LPC_PINCON->PINSEL1|=(0x3fUL);
- //PINMODE as default(PULLUP)
-
- //SPI Config
- //SPI Control Register
- LPC_SPI->SPCR=(1UL<<5);//Master mode,Mode 0 MSB first
- LPC_SPI->SPCCR=125;//SPI CLK=100000K/8/125=100KHz
- }
复制代码 首先是SPI的外设供电,这个在PCONP中看一下就行,其实默认是打开的(GPIO也是)。接下来是PCLK配置,1768默认为100MHz,我这里打算把最终SPI的SCLK配置为100K,这里来个8分频。然后是SCLK针脚、MISO、MOSI等的配置,这个对着PINSEL1就能搞定。PINMODE这个就采用默认的PULLUP就行,OPEN-DRAIN就没必要了(不过好像配置了也可以,比较懂这个大牛看能否详细讲解一下两者的差别)。最后就是配置工作模式和SCLK了。主要是SPCR寄存器,SPI一般有四种工作模式,这里配置为模式0,也是很多器件支持的模式,然后高位bit优先(这也是标准方式),单次传送1个字节,其实可以配置为最多16个bit,这里8bit主要是为外设考虑。
2.数据收发
接下来就是数据的收发了。SPI协议是一个很有趣的协议,主从器件相当于一个循环移位寄存器,一边shift in,一边shift out。给多少位数据,才能获取多少位数据。
- //give a byte, get a byte
- uint8_t XDSPI_Swap(uint8_t dat)
- {
- uint8_t x;
- LPC_SPI->SPDR=dat;
- while((LPC_SPI->SPSR & 0x80)!=0x80);//wait for SPIF
- x=(uint8_t)LPC_SPI->SPDR;
- return x;
- }
复制代码 这个函数就是发送一个字节,然后返回接收到的字节。
3. 测试一下
几行代码,一张图就可以说明问题了:
- XDSPI_Config();
- while(1)
- {
- XDSPI_Swap(x);
- x++;
- XDDelay_ms(50);
- }
复制代码 逻辑分析仪抓个波看一下:
|
|