查看: 5819|回复: 9

[求助] LPC824的SPI接口

[复制链接]
  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-12-22 14:05:35 | 显示全部楼层 |阅读模式
        各位FAE大哥,最近看了一下LPC824的SPI接口,感觉有点别扭呢,以前用FSL的芯片SPI都是封装成一个接口uint8_t SpiWriteRead(uint8_t inPut),片选用个IO控制,貌似其他的芯片大多数也是这样子的。由于想节约成本把以前的东西放到LPC824上。但是看了看驱动Flash的Demo代码看的我有点懵13啊。看到传输的函数有三个,开始、中间和结束。像我上面的方式不行么?为什么非得做成那个样子呢?
    1. /*********************************************************************************************************
    2. ** º¯ÊýÃû³Æ: SendRecv_Byte
    3. ** º¯Êý¹¦ÄÜ£ºÒ»´Î´«ÊäÄÚ²¿µÄµ¥×Ö½ÚÖ¡·¢ËÍÓë½ÓÊÕ
    4. ** ÊäÈë²ÎÊý: Êý¾ÝÏßÉÏ·¢ËͳöµÄÊý¾Ý
    5. ** Êä³ö²ÎÊý: Êý¾ÝÏßÉϽÓÊÕµ½µÄÊý¾Ý
    6. ** ·µ »Ø Öµ£ºÎÞ
    7. *********************************************************************************************************/
    8. INT8U SendRecv_Byte (INT8U ucData)
    9. {
    10.     while (!(LPC_SPI0->STAT & (1 << 1)));                               /* µÈ´ý·¢ËÍ×¼±¸¾ÍÐ÷             */
    11.     LPC_SPI0->TXDATCTL = FLEN(8) | EOF_EN | ucData;                     /* 8 λ£¬Ö¡½áÊø                 */   
    12.    
    13.     while (!(LPC_SPI0->STAT & (1 << 0)));                               /* µÈ´ý½ÓÊÕÊý¾ÝÍê³É             */
    14.     ucData = LPC_SPI0->RXDAT;                                           /* ½ÓÊÕÊý¾Ý                     */
    15.    
    16.     return ucData;
    17. }

    18. /*********************************************************************************************************
    19. ** º¯ÊýÃû³Æ: SendRecv_Start
    20. ** º¯Êý¹¦ÄÜ£ºÒ»´Î´«ÊäÆðʼµÄµ¥×Ö½ÚÖ¡·¢ËÍÓë½ÓÊÕ
    21. ** ÊäÈë²ÎÊý: Êý¾ÝÏßÉÏ·¢ËͳöµÄÊý¾Ý
    22. ** Êä³ö²ÎÊý: Êý¾ÝÏßÉϽÓÊÕµ½µÄÊý¾Ý
    23. ** ·µ »Ø Öµ£ºÎÞ
    24. *********************************************************************************************************/
    25. INT8U SendRecv_Start (INT8U ucData)
    26. {
    27.     while (!(LPC_SPI0->STAT & (1 << 1)));                               /* µÈ´ý·¢ËÍ×¼±¸¾ÍÐ÷             */
    28.     LPC_SPI0->TXDATCTL = FLEN(8) | EOF_EN | SSEL_EN | ucData;           /* 8 룬´«Ê俪ʼ£¬Ö¡½áÊø       */   
    29.    
    30.     while (!(LPC_SPI0->STAT & (1 << 0)));                               /* µÈ´ý½ÓÊÕÊý¾ÝÍê³É             */
    31.     ucData = LPC_SPI0->RXDAT;                                           /* ½ÓÊÕÊý¾Ý                     */
    32.    
    33.     return ucData;
    34. }

    35. /*********************************************************************************************************
    36. ** º¯ÊýÃû³Æ: SendRecv_Stop
    37. ** º¯Êý¹¦ÄÜ£ºÒ»´Î´«Êä½áÊøµÄµ¥×Ö½ÚÖ¡·¢ËÍÓë½ÓÊÕ
    38. ** ÊäÈë²ÎÊý: Êý¾ÝÏßÉÏ·¢ËͳöµÄÊý¾Ý
    39. ** Êä³ö²ÎÊý: Êý¾ÝÏßÉϽÓÊÕµ½µÄÊý¾Ý
    40. ** ·µ »Ø Öµ£ºÎÞ
    41. *********************************************************************************************************/
    42. INT8U SendRecv_Stop (INT8U ucData)
    43. {
    44.     while (!(LPC_SPI0->STAT & (1 << 1)));                               /* µÈ´ý·¢ËÍ×¼±¸¾ÍÐ÷             */
    45.     LPC_SPI0->TXDATCTL = FLEN(8) | EOT_EN | ucData;                     /* 8 룬´«Êä½áÊø               */   
    46.    
    47.     while (!(LPC_SPI0->STAT & (1 << 0)));                               /* µÈ´ý½ÓÊÕÊý¾ÝÍê³É             */
    48.     ucData = LPC_SPI0->RXDAT;                                           /* ½ÓÊÕÊý¾Ý                     */
    49.    
    50.     return ucData;
    51. }
    复制代码


    我知道答案 目前已有9人回答
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24890
    最后登录
    2025-7-21
    发表于 2016-12-22 15:19:01 | 显示全部楼层
    我觉得最大的特点就是增强了可读性,这个并不是必须,楼主完全可以按照kinetis的思想把三个函数并为一个函数。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-22 15:24:08 | 显示全部楼层
    小恩GG 发表于 2016-12-22 15:19
    我觉得最大的特点就是增强了可读性,这个并不是必须,楼主完全可以按照kinetis的思想把三个函数并为一个函 ...

    这三个函数,不仅仅是增大可读性的那么简单,三个函数都有一个细微的区别,里面涉及的EOT或者EOF的问题,按照恩哥说法,难道这两个位都不需要考虑么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-22 16:44:45 | 显示全部楼层
    小恩GG 发表于 2016-12-22 15:19
    我觉得最大的特点就是增强了可读性,这个并不是必须,楼主完全可以按照kinetis的思想把三个函数并为一个函 ...

    请恩哥测试一下,这是大多数网友的需求!我测试了一下用IO控制片选用中间的传送函数后面会丢包,用SEL片选信号不能结束。还有那个SPIFlash的例程我跑了一下用逻辑分析仪抓到的波形算是不能是别的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24890
    最后登录
    2025-7-21
    发表于 2016-12-22 16:59:51 | 显示全部楼层
    技术范儿 发表于 2016-12-22 15:24
    这三个函数,不仅仅是增大可读性的那么简单,三个函数都有一个细微的区别,里面涉及的EOT或者EOF的问题, ...

    如果认真细究,当然要考虑,但是我认为也不是必须, 看个人需求。
    其实这点的确比kinetis做的更多,更加灵活控制。
    首先分析下三个函数的区别。
    1. start
    使能了EOF_EN, SSEL_EN
    2. send data
    使能了EOF_EN
    3.stop
    使能了EOT_EN

    EOF_EN使能之后,数据之间插入延时FRAME_DELAY, 这个值在DLY寄存器中定义了。
    EOT_EN,结束传输,也就是发送数据后, 释放SSEL。
    如果你要像kinetis那样用GPIO去控制SSEL,同意的思想也是行得通的,比如发送前拉低CS,发送完拉高。数据与数据帧之间需要延时,就代码加,所以说并不是必须。
    如果分成三个,控制就更加灵活,主要就是数据与数据之间加入了延时,以及CS的控制区别。



    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24890
    最后登录
    2025-7-21
    发表于 2016-12-22 17:05:34 | 显示全部楼层
    技术范儿 发表于 2016-12-22 16:44
    请恩哥测试一下,这是大多数网友的需求!我测试了一下用IO控制片选用中间的传送函数后面会丢包,用SEL片 ...

    你说的丢包,是写入flash数据失败? 这个应该和数据与数据直接的延时长短有关。
    SEL片选如果你不关闭,SSEL信号线肯定还是拉低的,所以要结束,需要拉高SEL, 也就是控制EOT位。
    你说的例程不能识别,是官方例程在板子上跑失败了吗?
    我会再次测试下然后给你回复。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-22 17:08:45 | 显示全部楼层
    小恩GG 发表于 2016-12-22 17:05
    你说的丢包,是写入flash数据失败? 这个应该和数据与数据直接的延时长短有关。
    SEL片选如果你不关闭,SS ...

    我直接用逻辑分析仪抓的引脚,我再试试,有可能是其他原因。把这个问题消化掉就完美了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    54

    帖子

    0

    注册会员

    Rank: 2

    积分
    181
    最后登录
    2019-11-15
    发表于 2016-12-22 19:50:44 | 显示全部楼层
    SPI是MCU最基本的通信方式之一,每个厂商提供的库函数大同小异,没啥好纠结的。看不懂或调不好,只是你水平问题。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
     楼主| 发表于 2016-12-22 20:50:52 | 显示全部楼层
    衔胆栖冰 发表于 2016-12-22 19:50
    SPI是MCU最基本的通信方式之一,每个厂商提供的库函数大同小异,没啥好纠结的。看不懂或调不好,只是你水平 ...

    不喷lpc喷我了啊,调好了只是个疑问
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-31 22:07
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    20

    主题

    385

    帖子

    19

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2090
    最后登录
    2020-7-1
    发表于 2016-12-22 21:42:24 来自手机 | 显示全部楼层
    衔胆栖冰 发表于 2016-12-22 19:50
    SPI是MCU最基本的通信方式之一,每个厂商提供的库函数大同小异,没啥好纠结的。看不懂或调不好,只是你水平 ...

    老哥,说话太张扬,不好吧
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-21 18:13 , Processed in 0.106555 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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