[技术问答] 求SPI收、发一个字节程序

[复制链接]
1688|13
 楼主| dragonjun 发表于 2016-6-4 11:41 | 显示全部楼层 |阅读模式
09kk小熊 发表于 2016-6-4 16:51 | 显示全部楼层
什么芯片型号都不写,谁知道你要什么
zhuotuzi 发表于 2016-6-5 20:24 | 显示全部楼层
哪个芯片的?
zhuotuzi 发表于 2016-6-5 20:25 | 显示全部楼层
spi协议及工作原理分析.pdf (410.67 KB, 下载次数: 22)



zhuotuzi 发表于 2016-6-5 20:26 | 显示全部楼层
这玩意儿还分主机模式和从机模式,真是不知道咋给你弄。
zhuotuzi 发表于 2016-6-5 20:27 | 显示全部楼层
http://www.nuvoton.com/resource- ... CMSIS_V3.00.002.zip
看看这个里面的例程是不是你要的。
zhuomuniao110 发表于 2016-6-6 21:38 | 显示全部楼层
没说哪个单片机啊。
zhuomuniao110 发表于 2016-6-6 21:39 | 显示全部楼层
  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: 2 $
  5. * $Date: 15/10/12 8:13p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to communicate with an off-chip SPI slave device.
  7. *           This sample code needs to work with SPI_SlaveMode.
  8. *
  9. * @note
  10. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "Mini51Series.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;
  19. volatile uint32_t g_u32RxDataCount;
  20. volatile uint8_t g_u8Done;

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

  25.     /*---------------------------------------------------------------------------------------------------------*/
  26.     /* Init System Clock                                                                                       */
  27.     /*---------------------------------------------------------------------------------------------------------*/

  28.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  29.     SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
  30.     SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

  31.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  32.     CLK_EnableXtalRC(CLK_PWRCON_HXT|CLK_PWRCON_HIRC_EN_Msk);

  33.     /* Waiting for clock ready */
  34.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

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

  37.     /* STCLK to XTL STCLK to XTL */
  38.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_XTAL);

  39.     /* Enable IP clock */
  40.     CLK_EnableModuleClock(UART_MODULE);
  41.     CLK_EnableModuleClock(SPI_MODULE);

  42.     /* Select IP clock source */
  43.     CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_XTAL,CLK_CLKDIV_UART(1));

  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init I/O Multi-function                                                                                 */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Set P0 multi-function pins for UART RXD and TXD */
  48.     SYS->P0_MFP &= ~(SYS_MFP_P01_Msk | SYS_MFP_P00_Msk);
  49.     SYS->P0_MFP |= (SYS_MFP_P01_RXD | SYS_MFP_P00_TXD);

  50.     /* Setup SPI multi-function pin */
  51.     SYS->P0_MFP |= SYS_MFP_P04_SPISS | SYS_MFP_P05_MOSI | SYS_MFP_P06_MISO | SYS_MFP_P07_SPICLK;

  52.     /* Lock protected registers */
  53.     SYS_LockReg();

  54.     /* Update System Core Clock */
  55.     SystemCoreClockUpdate();
  56. }

  57. void UART_Init(void)
  58. {
  59.     /*---------------------------------------------------------------------------------------------------------*/
  60.     /* Init UART                                                                                               */
  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Reset IP */
  63.     SYS_ResetModule(UART_RST);

  64.     /* Configure UART and set UART Baudrate */
  65.     UART_Open(UART, 115200);
  66. }

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

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

  78. void SPI_IRQHandler(void)
  79. {
  80.     SPI_CLR_UNIT_TRANS_INT_FLAG(SPI0);
  81.     g_u8Done = 1;
  82. }

  83. int main(void)
  84. {
  85.     uint32_t u32DataCount, i;

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

  88.     /* Init UART for printf */
  89.     UART_Init();

  90.     /* Init SPI */
  91.     SPI_Init();

  92.     printf("\n\n");
  93.     printf("+----------------------------------------------------------------------+\n");
  94.     printf("|                       SPI Driver Sample Code                         |\n");
  95.     printf("+----------------------------------------------------------------------+\n");
  96.     printf("\n");

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

  99.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++) {
  100.         g_au32SourceData[u32DataCount] = 0x00550000 + u32DataCount;
  101.         g_au32DestinationData[u32DataCount] = 0;
  102.     }

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

  106.     SPI_EnableInt(SPI0, SPI_IE_MASK);
  107.     NVIC_EnableIRQ(SPI_IRQn);

  108.     for(i=0; i<TEST_COUNT; i++) {
  109.         g_u8Done = 0;
  110.         SPI_WRITE_TX(SPI0, g_au32SourceData[i]);
  111.         SPI_TRIGGER(SPI0);

  112.         while(!g_u8Done);
  113.         g_au32DestinationData[i] = SPI_READ_RX(SPI0);
  114.     }

  115.     printf("Received data:\n");
  116.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++) {
  117.         printf("%d:\t0x%08X\n", u32DataCount, g_au32DestinationData[u32DataCount]);
  118.     }

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

  120.     while(1);
  121. }


zhuomuniao110 发表于 2016-6-6 21:44 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Revision: 3 $
  5. * $Date: 15/10/13 2:15p $
  6. * @brief    Demonstrate how to communicate with an off-chip SPI master device.
  7. *           This sample code needs to work with SPI_MasterMode.
  8. *
  9. * @note
  10. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "Mini51Series.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;
  19. volatile uint32_t g_u32RxDataCount;
  20. volatile uint8_t g_u8Done;

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

  25.     /*---------------------------------------------------------------------------------------------------------*/
  26.     /* Init System Clock                                                                                       */
  27.     /*---------------------------------------------------------------------------------------------------------*/

  28.     /* Set P5 multi-function pins for XTAL1 and XTAL2 */
  29.     SYS->P5_MFP &= ~(SYS_MFP_P50_Msk | SYS_MFP_P51_Msk);
  30.     SYS->P5_MFP |= (SYS_MFP_P50_XTAL1 | SYS_MFP_P51_XTAL2);

  31.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  32.     CLK_EnableXtalRC(CLK_PWRCON_HXT|CLK_PWRCON_HIRC_EN_Msk);

  33.     /* Waiting for clock ready */
  34.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL_STB_Msk | CLK_CLKSTATUS_IRC22M_STB_Msk);

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

  37.     /* STCLK to XTL STCLK to XTL */
  38.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_XTAL);

  39.     /* Enable IP clock */
  40.     CLK_EnableModuleClock(UART_MODULE);
  41.     CLK_EnableModuleClock(SPI_MODULE);

  42.     /* Select IP clock source */
  43.     CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_XTAL,CLK_CLKDIV_UART(1));

  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init I/O Multi-function                                                                                 */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Set P0 multi-function pins for UART RXD and TXD */
  48.     SYS->P0_MFP &= ~(SYS_MFP_P01_Msk | SYS_MFP_P00_Msk);
  49.     SYS->P0_MFP |= (SYS_MFP_P01_RXD | SYS_MFP_P00_TXD);

  50.     /* Setup SPI multi-function pin */
  51.     SYS->P0_MFP |= SYS_MFP_P04_SPISS | SYS_MFP_P05_MOSI | SYS_MFP_P06_MISO | SYS_MFP_P07_SPICLK;

  52.     /* Lock protected registers */
  53.     SYS_LockReg();

  54.     /* Update System Core Clock */
  55.     SystemCoreClockUpdate();
  56. }

  57. void UART_Init(void)
  58. {
  59.     /*---------------------------------------------------------------------------------------------------------*/
  60.     /* Init UART                                                                                               */
  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Reset IP */
  63.     SYS_ResetModule(UART_RST);

  64.     /* Configure UART and set UART Baudrate */
  65.     UART_Open(UART, 115200);
  66. }

  67. void SPI_Init(void)
  68. {
  69.     /*---------------------------------------------------------------------------------------------------------*/
  70.     /* Init SPI                                                                                                */
  71.     /*---------------------------------------------------------------------------------------------------------*/
  72.     /* Configure as a slave, clock idle low, falling clock edge Tx, rising edge Rx and 32-bit transaction */
  73.     /* Set IP clock divider. SPI clock rate = 2MHz */
  74.     SPI_Open(SPI, SPI_SLAVE, SPI_MODE_0, 32, 2000000);

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

  78. void SPI_IRQHandler(void)
  79. {
  80.     SPI_CLR_UNIT_TRANS_INT_FLAG(SPI0);
  81.     g_u8Done = 1;
  82. }

  83. int main(void)
  84. {
  85.     uint32_t u32DataCount, i;

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

  88.     /* Init UART for printf */
  89.     UART_Init();

  90.     /* Init SPI */
  91.     SPI_Init();

  92.     printf("\n\n");
  93.     printf("+----------------------------------------------------------------------+\n");
  94.     printf("|                       SPI Driver Sample Code                         |\n");
  95.     printf("+----------------------------------------------------------------------+\n");
  96.     printf("\n");

  97.     printf("Configure SPI as a slave.\n");
  98.     printf("SPI clock rate: %d Hz\n", SPI_GetBusClock(SPI0));

  99.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++) {
  100.         g_au32SourceData[u32DataCount] = 0x00550000 + u32DataCount;
  101.         g_au32DestinationData[u32DataCount] = 0;
  102.     }

  103.     SPI_EnableInt(SPI0, SPI_IE_MASK);
  104.     NVIC_EnableIRQ(SPI_IRQn);

  105.     for(i=0; i<TEST_COUNT; i++) {
  106.         g_u8Done = 0;
  107.         SPI_WRITE_TX(SPI0, g_au32SourceData[i]);
  108.         SPI_TRIGGER(SPI0);

  109.         while(!g_u8Done);
  110.         g_au32DestinationData[i] = SPI_READ_RX(SPI0);
  111.     }

  112.     printf("Received data:\n");
  113.     for(u32DataCount=0; u32DataCount<TEST_COUNT; u32DataCount++) {
  114.         printf("%d:\t0x%08X\n", u32DataCount, g_au32DestinationData[u32DataCount]);
  115.     }

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

  117.     while(1);
  118. }


gejigeji521 发表于 2016-6-7 16:49 | 显示全部楼层
没有给出任何信息,不知道你要玩什么。
yiyigirl2014 发表于 2016-6-7 17:38 | 显示全部楼层
楼主忽悠人呢
wahahaheihei 发表于 2016-6-8 09:48 | 显示全部楼层
SPI的东西太多了,我用过MAX7219
cnb12345 发表于 2016-6-8 11:21 | 显示全部楼层
楼主好懒
天灵灵地灵灵 发表于 2016-6-8 21:46 | 显示全部楼层
楼主SPI搞的哪个?用神马呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

26

帖子

0

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