[DemoCode下载] Mini58采用FIFO来发送接收SPI

[复制链接]
1172|2
 楼主| xinxianshi 发表于 2024-7-22 21:54 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 1 $
  5. * $Date: 15/11/05 11:31a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Mini58 SPI Driver Sample Code
  7. *           This is a SPI master mode demo and need to be tested with a slave device.
  8. *
  9. * @note
  10. * Copyright (C) 2015 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "Mini58Series.h"

  15. #define TEST_COUNT 16

  16. uint32_t g_au32SourceData[TEST_COUNT];
  17. uint32_t g_au32DestinationData[TEST_COUNT];
  18. volatile uint32_t g_u32TxDataCount = 0;
  19. volatile uint32_t g_u32RxDataCount = 0;

  20. void SYS_Init(void)
  21. {
  22.     /* Unlock protected registers */
  23.     SYS_UnlockReg();

  24.     /* Unlock protected registers */
  25.     SYS_UnlockReg();

  26.     /*---------------------------------------------------------------------------------------------------------*/
  27.     /* Init System Clock                                                                                       */
  28.     /*---------------------------------------------------------------------------------------------------------*/
  29.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  30.     SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
  31.     SYS->P5_MFP |= (SYS_MFP_P50_XT1_IN | SYS_MFP_P51_XT1_OUT);

  32.     /* Enable external 12MHz XTAL, HIRC */
  33.     CLK->PWRCTL |= CLK_PWRCTL_XTL12M | CLK_PWRCTL_HIRCEN_Msk;

  34.     /* Waiting for clock ready */
  35.     CLK_WaitClockReady(CLK_STATUS_XTLSTB_Msk | CLK_STATUS_HIRCSTB_Msk);

  36.     /* Switch HCLK clock source to XTL */
  37.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_XTAL,CLK_CLKDIV_HCLK(1));

  38.     /* STCLK to XTL STCLK to XTL */
  39.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_XTAL);

  40.     /* Enable IP clock */
  41.     CLK_EnableModuleClock(UART0_MODULE);
  42.     CLK_EnableModuleClock(SPI0_MODULE);

  43.     /* Select IP clock source */
  44.     CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UARTSEL_XTAL,CLK_CLKDIV_UART(1));
  45.     CLK_SetModuleClock(SPI0_MODULE,CLK_CLKSEL1_SPISEL_XTAL,0);

  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Init I/O Multi-function                                                                                 */
  48.     /*---------------------------------------------------------------------------------------------------------*/
  49.     /* Set P1 multi-function pins for UART RXD and TXD */
  50.     SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
  51.     SYS->P1_MFP |= (SYS_MFP_P12_UART0_RXD | SYS_MFP_P13_UART0_TXD);

  52.     /* Setup SPI multi-function pin */
  53.     SYS->P0_MFP |= SYS_MFP_P04_SPI0_SS | SYS_MFP_P05_SPI0_MOSI | SYS_MFP_P06_SPI0_MISO | SYS_MFP_P07_SPI0_CLK;

  54.     /* Lock protected registers */
  55.     SYS_LockReg();

  56.     /* Update System Core Clock */
  57.     SystemCoreClockUpdate();
  58. }

  59. void UART_Init(void)
  60. {
  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Init UART                                                                                               */
  63.     /*---------------------------------------------------------------------------------------------------------*/
  64.     /* Reset IP */
  65.     SYS_ResetModule(UART0_RST);

  66.     /* Configure UART and set UART Baudrate */
  67.     UART_Open(UART0, 115200);
  68. }

  69. void SPI_Init(void)
  70. {
  71.     /*---------------------------------------------------------------------------------------------------------*/
  72.     /* Init SPI                                                                                                */
  73.     /*---------------------------------------------------------------------------------------------------------*/
  74.     /* Configure as a master, clock idle low, falling clock edge Tx, rising edge Rx and 32-bit transaction */
  75.     /* Set IP clock divider. SPI clock rate = 1MHz */
  76.     SPI_Open(SPI, SPI_MASTER, SPI_MODE_0, 32, 1000000);

  77.     /* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
  78.     SPI_EnableAutoSS(SPI, SPI_SS, SPI_SS_ACTIVE_LOW);
  79. }

  80. void SPI_IRQHandler(void)
  81. {
  82.     uint32_t temp;

  83.     while((SPI_GET_RX_FIFO_EMPTY_FLAG(SPI0))==0)
  84.     {
  85.         temp = SPI_READ_RX(SPI0);
  86.         g_au32DestinationData[g_u32RxDataCount++] = temp;
  87.     }

  88.     while( (SPI_GET_TX_FIFO_FULL_FLAG(SPI0)==0) && (g_u32TxDataCount<TEST_COUNT) )
  89.     {
  90.         SPI_WRITE_TX(SPI0, g_au32SourceData[g_u32TxDataCount++]);
  91.     }

  92.     if(g_u32TxDataCount>=TEST_COUNT)
  93.         SPI_DisableInt(SPI0, SPI_FIFO_TX_INTEN_MASK); /* Disable TX FIFO threshold interrupt */
  94. }

  95. int main(void)
  96. {
  97.     uint32_t u32DataCount;

  98.     /* Init System, IP clock and multi-function I/O */
  99.     SYS_Init();

  100.     /* Init UART for printf */
  101.     UART_Init();

  102.     /* Init SPI */
  103.     SPI_Init();

  104.     printf("\n\n");
  105.     printf("+----------------------------------------------------------------------+\n");
  106.     printf("|                       SPI Driver Sample Code                         |\n");
  107.     printf("+----------------------------------------------------------------------+\n");
  108.     printf("\n");

  109.     printf("Configure SPI as a master.\n");
  110.     printf("SPI clock rate: %d Hz\n", SPI_GetBusClock(SPI0));

  111.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++)
  112.     {
  113.         g_au32SourceData[u32DataCount] = 0x00550000 + u32DataCount;
  114.         g_au32DestinationData[u32DataCount] = 0;
  115.     }

  116.     printf("Before starting the data transfer, make sure the slave device is ready. Press any key to start the transfer.\n");
  117.     getchar();
  118.     printf("\n");

  119.     SPI_EnableInt(SPI0, SPI_FIFO_TX_INTEN_MASK | SPI_FIFO_RX_INTEN_MASK);
  120.     NVIC_EnableIRQ(SPI_IRQn);
  121.     SPI_EnableFIFO(SPI0, 2, 1);

  122.     /* Wait for transfer done */
  123.     while(g_u32RxDataCount<TEST_COUNT);

  124.     printf("Received data:\n");
  125.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++)
  126.     {
  127.         printf("%d:\t0x%08X\n", u32DataCount, g_au32DestinationData[u32DataCount]);
  128.     }

  129.     printf("The data transfer was done.\n");

  130.     while(1);
  131. }



 楼主| xinxianshi 发表于 2024-7-22 21:57 | 显示全部楼层
第一步:使能模块时钟,设置模块时钟
第二步:配置映射引脚
第三步:打开SPI,配置SPI参数和模式波特率
第十部,配置中断使能FIFO到SPI
然后就是中断函数。
guijial511 发表于 2024-7-23 19:24 来自手机 | 显示全部楼层
FIFO还是软件层面的应用,用DMA进行收发数据效率才高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部