请选择 进入手机版 | 继续访问电脑版
查看: 38|回复: 2

[原创] LPC17xx的SPI配置

[复制链接]
  • TA的每日心情
    慵懒
    13 小时前
  • 签到天数: 280 天

    [LV.8]以坛为家I

    103

    主题

    3112

    帖子

    63

    金豆

    超级版主

    Rank: 8Rank: 8

    积分
    17293
    最后登录
    2019-9-20
    发表于 2019-8-21 16:21:02 | 显示全部楼层 |阅读模式
    本帖最后由 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家这点非常好,就是文档描述和芯片行为完全一致,先上代码:
    1. void XDSPI_Config(void)
    2. {
    3.         //PIN Config
    4.         LPC_SC->PCONP|=(1UL<<8);//set bit PCSPI
    5.         LPC_SC->PCLKSEL0|=(3UL<<16);// PCLK=CCLK/8
    6.         //P0.15 for SCK
    7.         LPC_PINCON->PINSEL0|=(3UL<<30);
    8.         //P0.16 for SSEL
    9.         //P0.17 for MISO
    10.         //P0.18 for MOSI
    11.         LPC_PINCON->PINSEL1|=(0x3fUL);
    12.         //PINMODE as default(PULLUP)
    13.         
    14.         //SPI Config
    15.         //SPI Control Register
    16.         LPC_SPI->SPCR=(1UL<<5);//Master mode,Mode 0 MSB first        
    17.         LPC_SPI->SPCCR=125;//SPI CLK=100000K/8/125=100KHz
    18. }
    复制代码
    首先是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。给多少位数据,才能获取多少位数据。
    1. //give a byte, get a byte
    2. uint8_t XDSPI_Swap(uint8_t dat)
    3. {
    4.         uint8_t x;
    5.         LPC_SPI->SPDR=dat;
    6.         while((LPC_SPI->SPSR & 0x80)!=0x80);//wait for SPIF
    7.         x=(uint8_t)LPC_SPI->SPDR;
    8.         return x;
    9. }
    复制代码
    这个函数就是发送一个字节,然后返回接收到的字节。

    3. 测试一下
    几行代码,一张图就可以说明问题了:
    1. XDSPI_Config();
    2.         while(1)
    3.         {
    4.                 XDSPI_Swap(x);
    5.                 x++;
    6.                 XDDelay_ms(50);
    7.         }
    复制代码
    逻辑分析仪抓个波看一下:
    1.png

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-20 09:11
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    29

    主题

    97

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    584
    最后登录
    2019-9-18
    发表于 2019-8-22 09:16:33 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    216

    主题

    4466

    帖子

    0

    金豆

    超级版主

    Rank: 8Rank: 8

    积分
    6695
    最后登录
    2019-9-20
    发表于 2019-8-28 11:30:42 | 显示全部楼层
    感谢楼主的经验分享!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|恩智浦技术社区

    GMT+8, 2019-9-20 21:53 , Processed in 0.052388 second(s), 16 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表