查看: 6628|回复: 6

[原创] LPC824 lite入门教程五 SPI

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    [LV.10]以坛为家III

    66

    主题

    4888

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6156
    最后登录
    2024-5-5
    发表于 2016-11-5 15:19:08 | 显示全部楼层 |阅读模式
    本帖最后由 原来的你 于 2016-11-5 15:19 编辑

    LPC824具有两个SPI接口,可以通过SPI接口与外部芯片通信,比如SPI flash存储芯片等。LPC824的SPI特点:
    1-16位的数据帧被直接支持,更大的数据帧可结合软件来实现。
    • 主/从模式。
    • 支持发送数据到从设备时,无需读取进来的数据。这可用于外
    SPI存储器时。
    • 可以选择将控制信息随着数据一起写入。这将允许实现多种功
    能的操作,包括任意长度的数据帧的操作。
    • 最多4条片选输入输出信号,且极性可选,使用灵活。
    • 收发支持DMA
    • 支持低功耗模式(sleep/deep sleep/power down mode)唤醒。
    注意:不支持TI的SSI和National的Microwire模式


    SPI功能可以通过开关矩阵(switch matrix)来配置安排到所有数字引脚。建议:引脚PIO0_10PIO0_11 open-drain pins)不要用于SPI
    QQ截图20161105145938.png QQ截图20161105150020.png QQ截图20161105150031.png QQ截图20161105150042.png QQ截图20161105150055.png QQ截图20161105150107.png QQ截图20161105150117.png QQ截图20161105150128.png QQ截图20161105150137.png QQ截图20161105150148.png QQ截图20161105150158.png QQ截图20161105150208.png QQ截图20161105150220.png QQ截图20161105150232.png QQ截图20161105150241.png
    /* Initializes pin muxing for SPI1 interface - note that SystemInit() may
       already setup your pin muxing at system startup */
    static void Init_SPI_PinMux(void) //初始化SPI1
    {
    #if (defined(BOARD_NXP_LPCXPRESSO_812) || defined(BOARD_LPC812MAX))
            /* Enable the clock to the Switch Matrix */
            Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);//打开开关矩阵时钟
            /*
             * Initialize SSP0 pins connect
             * SCK1: PINASSIGN4[31:24]: Select P0.12
             * MOSI1: PINASSIGN5[7:0]: Select P0.14
             * MISO1: PINASSIGN5[15:8] : Select P0.6
             * SSEL1: PINASSIGN5[23:16]: Select P0.13
             */
            Chip_SWM_DisableFixedPin(SWM_FIXED_VDDCMP);//关闭开关矩阵VDDCMP功能
            Chip_SWM_MovablePinAssign(SWM_SPI1_SCK_IO, 12);//选择P0.12作为SPI SCK1
            Chip_SWM_MovablePinAssign(SWM_SPI1_MOSI_IO, 14);//选择P0.14作为SPI MOSI1
    #if defined(BOARD_LPC812MAX)
            Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 15);//选择P0.15作为SPI MISO1
    #else
            Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 6);//选择P0.6作为SPI MISO1
    #endif
            Chip_SWM_MovablePinAssign(SWM_SPI1_SSEL_IO, 13);//选择P0.13作为SPI SSEL1

            /* Disable the clock to the Switch Matrix to save power */
            Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);//关闭开关矩阵时钟
    #elif defined(BOARD_NXP_LPCXPRESSO_824)
            Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);//打开开关矩阵时钟
            Chip_SWM_MovablePinAssign(SWM_SPI1_SSEL0_IO, 15);//选择P0.15作为SPI SSEL1
            Chip_SWM_MovablePinAssign(SWM_SPI1_SCK_IO, 24);//选择P0.24作为SPI SCK1
            Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 25);//选择P0.25作为SPI MISO1
            Chip_SWM_MovablePinAssign(SWM_SPI1_MOSI_IO, 26);//选择P0.26作为SPI MOSI1
            Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);//关闭开关矩阵时钟
    #else
            /* Configure your own SPI pin muxing here if needed */
    #warning "No SPI pin muxing defined"
    #endif
    }
    int main(void)
    {
            SystemCoreClockUpdate();
            Board_Init();

            /* SPI initialization */
            Init_SPI_PinMux();//初始化SPI引脚

            /*
               ConfigStruct.Mode = SPI_MODE_TEST;
               ConfigStruct.ClkDiv = Chip_SPI_CalClkRateDivider(LPC_SPI, 100000);
               ConfigStruct.ClockMode = SPI_CLOCK_CPHA0_CPOL0;
               ConfigStruct.DataOrder = SPI_DATA_MSB_FIRST;
               ConfigStruct.SSELPol = SPI_SSEL_ACTIVE_LO;
             */
            Chip_SPI_Init(LPC_SPI);//初始化SPI
            Chip_SPI_ConfigureSPI(LPC_SPI, SPI_MODE_TEST |        /* Enable master/Slave mode *///使能SPI主/从模式
                                                      SPI_CLOCK_CPHA0_CPOL0 |        /* Set Clock polarity to 0 *///SPI极性为0
                                                      SPI_CFG_MSB_FIRST_EN |/* Enable MSB first option *///SPI先发送高字节
                                                      SPI_CFG_SPOL_LO);        /* Chipselect is active low *///SPI片选脚为低

            DelayConfigStruct.FrameDelay = 0;
            DelayConfigStruct.PostDelay = 0;
            DelayConfigStruct.PreDelay = 0;
            DelayConfigStruct.TransferDelay = 0;
            Chip_SPI_DelayConfig(LPC_SPI, &DelayConfigStruct);//SPI延时设置

    #if INTERRUPT_MODE
            /* Setting SPI interrupt */
            NVIC_EnableIRQ(SPI_IRQ);//使能SPI中断
    #endif
            Chip_SPI_Enable(LPC_SPI);//使能SPI

    #if LOOPBACK_TEST
            Chip_SPI_EnableLoopBack(LPC_SPI);//SPI回调使能
    #endif
            bufferInit();
            XfSetup.Length = BUFFER_SIZE;
            XfSetup.pTx = TxBuf;
            XfSetup.RxCnt = XfSetup.TxCnt = 0;
            XfSetup.DataSize = 8;

    #if (RW_TEST || LOOPBACK_TEST)
            XfSetup.pRx = RxBuf;
    #else
            XfSetup.pRx = NULL;
    #endif

    #if POLLING_MODE
    #if (RW_TEST || LOOPBACK_TEST)
            Chip_SPI_RWFrames_Blocking(LPC_SPI, &XfSetup);
    #else
            Chip_SPI_WriteFrames_Blocking(LPC_SPI, &XfSetup);
    #endif

    #elif INTERRUPT_MODE
            Chip_SPI_Int_RWFrames(LPC_SPI, &XfSetup);
            Chip_SPI_Int_Cmd(LPC_SPI, SPI_INTENSET_TXDYEN | SPI_INTENSET_RXDYEN
                                             | SPI_INTENSET_RXOVEN | SPI_INTENSET_TXUREN, ENABLE);
            while (!isXferCompleted) {}
            while (!(Chip_SPI_GetStatus(LPC_SPI) & SPI_STAT_SSD)) {}/* Make sure the last frame sent completely */
    #endif /*INTERRUPT_MODE*/

    #if (RW_TEST || LOOPBACK_TEST)
            if (bufferVerify()) {
                    Board_LED_Set(1, true);
            }
            else
    #endif  /*(RW_TEST || LOOPBACK_TEST)*/
            {
                    Board_LED_Set(0, true);
            }

    #if LOOPBACK_TEST
            Chip_SPI_DisableLoopBack(LPC_SPI);
    #endif
            /* DeInitialize SPI peripheral */
            Chip_SPI_DeInit(LPC_SPI);

            while (1) {}
    }









    开心
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-5 17:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    12

    帖子

    0

    新手上路

    Rank: 1

    积分
    26
    最后登录
    2016-11-5
    发表于 2016-11-5 17:35:59 | 显示全部楼层
    感谢分享。
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2024-3-21 15:13
  • 签到天数: 41 天

    [LV.5]常住居民I

    32

    主题

    1820

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2024-3-21
    发表于 2016-11-5 18:01:19 | 显示全部楼层
    感谢分享,不过你到底是自己写的,还是抄的哪个PPT呀
    好多年没来了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
    发表于 2016-11-5 18:22:23 | 显示全部楼层
    一下午写了这么多,累不累啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-28 17:04
  • 签到天数: 285 天

    [LV.8]以坛为家I

    1

    主题

    428

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1577
    最后登录
    2018-6-28
    发表于 2016-11-5 22:06:02 | 显示全部楼层
    学习了~~~~~~~~~~


    NXP.JPG 与非.JPG
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    555

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    1343
    最后登录
    2018-10-23
    发表于 2016-11-6 08:52:50 | 显示全部楼层

    感谢分享
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5394
    最后登录
    2021-12-22
    发表于 2018-7-28 19:18:43 | 显示全部楼层
    接收发送stall停滞状态是什么意思? 影响后续发送接收吗?怎么处理?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-7 16:34 , Processed in 0.129072 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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