[DemoCode下载] 硬件曼彻斯特编解码器应用示例

[复制链接]
1364|6
 楼主| xinxianshi 发表于 2023-11-25 21:34 | 显示全部楼层 |阅读模式
  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: 20/06/10 2:23p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Use MANCH to do TX test by DMA
  7. * @note
  8. * SPDX-License-Identifier: Apache-2.0
  9. * Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "NuMicro.h"


  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Constant                                                                                                */
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* MANCH frequency */
  17. #define MANCH_FREQ_IN_HZ              1000

  18. /* Select PDMA channel for MANCH */
  19. #define MANCH_TX_PDMA_CH        0x00
  20. #define MANCH_RX_PDMA_CH        0x01

  21. /* MANCH format */
  22. #define MODE1_FRAME_BYTECOUNT   0x1E
  23. #define MODE1_IDLE              0x00
  24. #define MODE1_PREAMBLE          0x40
  25. #define MODE1_PREAMBLE_NUM      0x05
  26. #define MODE1_EOF               0x7F

  27. #define MODE2_FRAME_BYTECOUNT   0x40
  28. #define MODE2_IDLE              0x00
  29. #define MODE2_PREAMBLE          0x7E
  30. #define MODE2_PREAMBLE_NUM      0x04
  31. #define MODE2_EOF               0x7E

  32. #define MANCH_THOMAS            0x00
  33. #define MANCH_IEEE8023          0x01

  34. /*---------------------------------------------------------------------------------------------------------*/
  35. /* Global variables                                                                                        */
  36. /*---------------------------------------------------------------------------------------------------------*/
  37. uint8_t g_txBuf[256];
  38. uint8_t g_rxBuf[256];

  39. /*---------------------------------------------------------------------------------------------------------*/
  40. /* Function declaration                                                                                    */
  41. /*---------------------------------------------------------------------------------------------------------*/
  42. void SYS_Init(void);
  43. void UART0_Init(void);


  44. /*---------------------------------------------------------------------------------------------------------*/
  45. /*  Main Function                                                                                          */
  46. /*---------------------------------------------------------------------------------------------------------*/
  47. int32_t main(void)
  48. {
  49.     PDMA_T *pdma;
  50.     MANCH_T *manch;
  51.     uint32_t u32TimeOutCount;
  52.     uint32_t u32ModeSelect;
  53.     uint32_t u32FrameByteCount;
  54.     uint32_t u32Idle;
  55.     uint32_t u32Preamble;
  56.     uint32_t u32PreambleNum;
  57.     uint32_t u32FrameEnd;
  58.     uint32_t u32EncodedType;
  59.     uint32_t ii, jj=0;
  60.     uint8_t u8Option;

  61.     /* Set PDMA and MANCH modules */
  62.     pdma = PDMA;
  63.     manch = MANCH;

  64.     /* Unlock protected registers */
  65.     SYS_UnlockReg();

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

  68.     /* Lock protected registers */
  69.     SYS_LockReg();

  70.     /* Init UART0 for printf */
  71.     UART0_Init();

  72.     printf("+------------------------------------------------------------------------+\n");
  73.     printf("|                          MANCH Driver Sample Code                      |\n");
  74.     printf("+------------------------------------------------------------------------+\n");
  75.     printf("  This sample code will use TX pin (PB.7) to send MANCH encoded data. \n");
  76.     printf("  Press any key when to be ready.\n\n");
  77.     getchar();

  78.     while (1)
  79.     {
  80.         /*--------------------------------------------------------------------------------------*/
  81.         /* MANCH mode selection                                                                 */
  82.         /*--------------------------------------------------------------------------------------*/
  83.         /*==================================================
  84.             MANCH MODE-1
  85.           --------------------------------------------------
  86.               byte count per frame: 0x1E
  87.               IDLE pattern: 0x00
  88.               PREAMBLE pattern: 0x40
  89.               PREAMBLE pattern: 0x40
  90.           --------------------------------------------------
  91.             MANCH MODE-2
  92.           --------------------------------------------------
  93.               byte count per frame: 0x40
  94.               IDLE pattern: 0x00
  95.               PREAMBLE pattern: 0x7E
  96.           ==================================================*/
  97.         printf("  Please select MANCH mode:\n");
  98.         printf("    1: MANCH MODE-1 \n");
  99.         printf("    2: MANCH MODE-2 \n");
  100.         printf("    Other: Stop testing \n\n");
  101.         u8Option = getchar();
  102.         switch(u8Option)
  103.         {
  104.         case '1':
  105.             printf("  MANCH MODE-1 selected \n\n");
  106.             u32ModeSelect = MANCH_MODE1;
  107.             u32FrameByteCount = MODE1_FRAME_BYTECOUNT;
  108.             u32Idle = MODE1_IDLE;
  109.             u32Preamble = MODE1_PREAMBLE;
  110.             u32PreambleNum = MODE1_PREAMBLE_NUM;
  111.             u32FrameEnd = MODE1_EOF;
  112.             break;
  113.         case '2':
  114.             printf("  MANCH MODE-2 selected \n\n");
  115.             u32ModeSelect = MANCH_MODE2;
  116.             u32FrameByteCount = MODE2_FRAME_BYTECOUNT;
  117.             u32Idle = MODE2_IDLE;
  118.             u32Preamble = MODE2_PREAMBLE;
  119.             u32PreambleNum = MODE2_PREAMBLE_NUM;
  120.             u32FrameEnd = MODE2_EOF;
  121.             break;
  122.         default:
  123.             u32ModeSelect = MANCH_NONE;
  124.             break;
  125.         }

  126.         if (u32ModeSelect == MANCH_NONE)
  127.         {
  128.             printf("MANCH: Stop testing \n");
  129.             break;
  130.         }

  131.         printf("  Please select encoded type:\n");
  132.         printf("    1: Thomas format \n");
  133.         printf("    2: IEEE802.3 format \n");
  134.         printf("    Other: Thomas format (default) \n\n");
  135.         u8Option = getchar();
  136.         switch(u8Option)
  137.         {
  138.         case '1':
  139.         default:
  140.             printf("  Thomas format selected \n\n");
  141.             u32EncodedType = MANCH_THOMAS;
  142.             break;
  143.         case '2':
  144.             printf("  IEEE802.3 format selected \n\n");
  145.             u32EncodedType = MANCH_IEEE8023;
  146.             break;
  147.         }

  148.         /*--------------------------------------------------------------------------------------*/
  149.         /* Prepare test data                                                                    */
  150.         /*--------------------------------------------------------------------------------------*/
  151.         /* Preamble pattern */
  152.         for (ii=0; ii<u32PreambleNum; ii++)
  153.             g_txBuf[ii] = u32Preamble;

  154.         /* TX remaining data */
  155.         jj++;
  156.         for (ii=u32PreambleNum; ii<u32FrameByteCount-1; ii++)
  157.             g_txBuf[ii] += ii+jj;

  158.         /* End byte of frame */
  159.         g_txBuf[u32FrameByteCount-1] = u32FrameEnd;

  160.         /*--------------------------------------------------------------------------------------*/
  161.         /* Set MANCH TX related format                                                          */
  162.         /*--------------------------------------------------------------------------------------*/
  163.         /* Open MANCH */
  164.         MANCH_Open(manch, MANCH_FREQ_IN_HZ);

  165.         /* Set MANCH to NONE mode before to set related format */
  166.         MANCH_SetMode(manch, MANCH_NONE);

  167.         /* Set encoded format */
  168.         if (u32EncodedType == MANCH_THOMAS)
  169.             MANCH_ENCODE_THOMAS(manch);
  170.         else
  171.             MANCH_ENCODE_IEEE8023(manch);

  172.         /* Set Frame number */
  173.         MANCH_SetFrameNum(manch, u32FrameByteCount);

  174.         /* Set Idle pattern */
  175.         MANCH_SetIdle(manch, u32Idle);

  176.         /* Set Preamble pattern */
  177.         MANCH_SetPreamble(manch, u32Preamble);

  178.         /* Set Preamble number */
  179.         MANCH_SetPreambleNum(manch, u32PreambleNum);

  180.         /* Set TX polarity */
  181.         MANCH_TX_NOT_INVERTED(manch);

  182.         /* Reset transmit FIFO control */
  183.         MANCH_CLR_TX_FIFO(manch);
  184.         MANCH_NOTCLR_TX_FIFO(manch);

  185.         /* Clear Status register */
  186.         MANCH_CLR_STATUS(manch);

  187.         /*--------------------------------------------------------------------------------------*/
  188.         /* Set MANCH mode switch finally                                                        */
  189.         /*--------------------------------------------------------------------------------------*/
  190.         /* Disable TX DMA */
  191.         MANCH_DISABLE_TX_DMA(manch);

  192.         /* Set selected MANCH mode */
  193.         MANCH_SetMode(manch, u32ModeSelect);

  194.         /*--------------------------------------------------------------------------------------*/
  195.         /* Setup PDMA for MANCH TX                                                              */
  196.         /*--------------------------------------------------------------------------------------*/
  197.         /* Reset PDMA module */
  198.         SYS_ResetModule(PDMA_RST);

  199.         /* Enable PDMA channels */
  200.         PDMA_Open(pdma, 1<<MANCH_TX_PDMA_CH);

  201.         /*=======================================================================
  202.             MANCH TX PDMA channel configuration:
  203.           -----------------------------------------------------------------------
  204.               Word length = 8 bits
  205.               Transfer Count = u32FrameByteCount
  206.               Source = g_txBuf
  207.               Source Address = Increased
  208.               Destination = MANCH->TXDAT
  209.               Destination Address = Fixed
  210.               Burst Type = Single Transfer
  211.          ========================================================================*/
  212.         /* Set transfer width (8 bits) and transfer count */
  213.         PDMA_SetTransferCnt(pdma, MANCH_TX_PDMA_CH, PDMA_WIDTH_8, u32FrameByteCount);
  214.         /* Set source/destination address and attributes */
  215.         PDMA_SetTransferAddr(pdma, MANCH_TX_PDMA_CH, (uint32_t)g_txBuf, PDMA_SAR_INC, (uint32_t)&manch->TXDAT, PDMA_DAR_FIX);
  216.         /* Set request source; set basic mode. */
  217.         PDMA_SetTransferMode(pdma, MANCH_TX_PDMA_CH, PDMA_MANCH_TX, FALSE, 0);
  218.         /* Single request type; PDMA single request type. */
  219.         PDMA_SetBurstType(pdma, MANCH_TX_PDMA_CH, PDMA_REQ_SINGLE, 0);
  220.         /* Disable table interrupt */
  221.         PDMA->DSCT[MANCH_TX_PDMA_CH].CTL |= PDMA_DSCT_CTL_TBINTDIS_Msk;

  222.         /*--------------------------------------------------------------------------------------*/
  223.         /* Begin MANCH TX transfer                                                              */
  224.         /*--------------------------------------------------------------------------------------*/
  225.         /* Enable TX and RX DMA */
  226.         MANCH_ENABLE_TX_DMA(manch);

  227.         /* TX enabled */
  228.         MANCH_ENABLE_TX(manch);

  229.         /*--------------------------------------------------------------------------------------*/
  230.         /* Wait DMA finished                                                                    */
  231.         /*--------------------------------------------------------------------------------------*/
  232.         /* Wait TX PDMA finished */
  233.         u32TimeOutCount = SystemCoreClock;
  234.         while((PDMA_GET_TD_STS(PDMA) & (1<<MANCH_TX_PDMA_CH))==0)
  235.         {
  236.             if(u32TimeOutCount == 0)
  237.             {
  238.                 printf("\nTimeout is happened, please check if something is wrong. \n");
  239.                 while(1);
  240.             }
  241.             u32TimeOutCount--;
  242.         }

  243.         /* Clear TX PDMA finished flag */
  244.         PDMA_CLR_TD_FLAG(PDMA, (1<<MANCH_TX_PDMA_CH));

  245.         /* Check and clear TX_DONE finished flag */
  246.         u32TimeOutCount = SystemCoreClock;
  247.         while(!MANCH_IS_TXFRAME_DONE(manch))
  248.         {
  249.             if(u32TimeOutCount == 0)
  250.             {
  251.                 printf("\nTimeout is happened, please check if something is wrong. \n");
  252.                 while(1);
  253.             }
  254.             u32TimeOutCount--;
  255.         }
  256.         MANCH_CLR_TXFRAME_DONE(manch);

  257.         /* Prepare to do another test */
  258.         printf("*** Prepare to do another TX test ***\n\n");
  259.     }
  260.     while(1);
  261. }

  262. void SYS_Init(void)
  263. {
  264.     /*--------------------------------------------------------------------------------------*/
  265.     /* Init System Clock                                                                    */
  266.     /*--------------------------------------------------------------------------------------*/
  267.     /* Enable Internal RC clock */
  268.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  269.     /* Waiting for Internal RC clock ready */
  270.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  271.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  272.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  273.     /* Enable UART module clock */
  274.     CLK_EnableModuleClock(UART0_MODULE);

  275.     /* Enable PDMA clock source */
  276.     CLK_EnableModuleClock(PDMA_MODULE);

  277.     /* Enable MANCH module clock */
  278.     CLK_EnableModuleClock(MANCH_MODULE);

  279.     /* Select UART module clock source */
  280.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

  281.     /*--------------------------------------------------------------------------------------*/
  282.     /* Init I/O Multi-function                                                              */
  283.     /*--------------------------------------------------------------------------------------*/
  284.     /* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
  285.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
  286.                     (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

  287.     /* Set PB multi-function pins for MANCH RXD=PB.6 and TXD=PB.7 */
  288.     SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB7MFP_Msk | SYS_GPB_MFPL_PB6MFP_Msk)) |
  289.                     (SYS_GPB_MFPL_PB7MFP_MANCH_TXD | SYS_GPB_MFPL_PB6MFP_MANCH_RXD);

  290. }

  291. void UART0_Init()
  292. {
  293.     /*--------------------------------------------------------------------------------------*/
  294.     /* Init UART                                                                            */
  295.     /*--------------------------------------------------------------------------------------*/
  296.     /* Configure UART0 and set UART0 baud rate */
  297.     UART_Open(UART0, 115200);
  298. }

  299. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/


 楼主| xinxianshi 发表于 2023-11-25 21:35 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * $Revision: 2 $
  5. * $Date: 20/06/10 2:23p $
  6. * @brief    Use MANCH to do RX test by DMA
  7. * @note
  8. * SPDX-License-Identifier: Apache-2.0
  9. * Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "NuMicro.h"


  13. /*---------------------------------------------------------------------------------------------------------*/
  14. /* Constant                                                                                                */
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* MANCH frequency */
  17. #define MANCH_FREQ_IN_HZ              1000

  18. /* Select PDMA channel for MANCH */
  19. #define MANCH_TX_PDMA_CH        0x00
  20. #define MANCH_RX_PDMA_CH        0x01

  21. /* MANCH format */
  22. #define MODE1_FRAME_BYTECOUNT   0x1E
  23. #define MODE1_IDLE              0x00
  24. #define MODE1_PREAMBLE          0x40
  25. #define MODE1_PREAMBLE_NUM      0x05
  26. #define MODE1_EOF               0x7F

  27. #define MODE2_FRAME_BYTECOUNT   0x40
  28. #define MODE2_IDLE              0x00
  29. #define MODE2_PREAMBLE          0x7E
  30. #define MODE2_PREAMBLE_NUM      0x04
  31. #define MODE2_EOF               0x7E

  32. #define MANCH_THOMAS            0x00
  33. #define MANCH_IEEE8023          0x01

  34. /*---------------------------------------------------------------------------------------------------------*/
  35. /* Global variables                                                                                        */
  36. /*---------------------------------------------------------------------------------------------------------*/
  37. uint8_t g_txBuf[256];
  38. uint8_t g_rxBuf[256];

  39. /*---------------------------------------------------------------------------------------------------------*/
  40. /* Function declaration                                                                                    */
  41. /*---------------------------------------------------------------------------------------------------------*/
  42. void SYS_Init(void);
  43. void UART0_Init(void);


  44. /*---------------------------------------------------------------------------------------------------------*/
  45. /*  Main Function                                                                                          */
  46. /*---------------------------------------------------------------------------------------------------------*/
  47. int32_t main(void)
  48. {
  49.     PDMA_T *pdma;
  50.     MANCH_T *manch;
  51.     uint32_t u32TimeOutCount;

  52.     uint32_t u32ModeSelect;
  53.     uint32_t u32FrameByteCount;
  54.     uint32_t u32Idle;
  55.     uint32_t u32Preamble;
  56.     uint32_t u32PreambleNum;
  57. //    uint32_t u32FrameEnd;
  58.     uint32_t u32EncodedType;
  59.     uint32_t ii;
  60.     uint8_t u8Option;
  61.     uint8_t *pu8rx;

  62.     /* Set PDMA and MANCH modules */
  63.     pdma = PDMA;
  64.     manch = MANCH;

  65.     /* Unlock protected registers */
  66.     SYS_UnlockReg();

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

  69.     /* Lock protected registers */
  70.     SYS_LockReg();

  71.     /* Init UART0 for printf */
  72.     UART0_Init();

  73.     printf("+------------------------------------------------------------------------+\n");
  74.     printf("|                          MANCH Driver Sample Code                      |\n");
  75.     printf("+------------------------------------------------------------------------+\n");
  76.     printf("  This sample code will use RX pin (PB.6) to receive MANCH code. \n");
  77.     printf("  To test this sample code, TX signal must be sent from another target board. \n");
  78.     printf("  Press any key when to be ready.\n\n");
  79.     getchar();

  80.     while (1)
  81.     {
  82.         /*--------------------------------------------------------------------------------------*/
  83.         /* MANCH mode selection                                                                 */
  84.         /*--------------------------------------------------------------------------------------*/
  85.         /*==================================================
  86.             MANCH MODE-1
  87.           --------------------------------------------------
  88.               byte count per frame: 0x1E
  89.               IDLE pattern: 0x00
  90.               PREAMBLE pattern: 0x40
  91.               PREAMBLE pattern: 0x40
  92.           --------------------------------------------------
  93.             MANCH MODE-2
  94.           --------------------------------------------------
  95.               byte count per frame: 0x40
  96.               IDLE pattern: 0x00
  97.               PREAMBLE pattern: 0x7E
  98.           ==================================================*/
  99.         printf("  Please select MANCH mode:\n");
  100.         printf("    1: MANCH MODE-1 \n");
  101.         printf("    2: MANCH MODE-2 \n");
  102.         printf("    Other: Stop testing \n\n");
  103.         u8Option = getchar();
  104.         switch(u8Option)
  105.         {
  106.         case '1':
  107.             printf("  MANCH MODE-1 selected \n\n");
  108.             u32ModeSelect = MANCH_MODE1;
  109.             u32FrameByteCount = MODE1_FRAME_BYTECOUNT;
  110.             u32Idle = MODE1_IDLE;
  111.             u32Preamble = MODE1_PREAMBLE;
  112.             u32PreambleNum = MODE1_PREAMBLE_NUM;
  113. //            u32FrameEnd = MODE1_EOF;
  114.             break;
  115.         case '2':
  116.             printf("  MANCH MODE-2 selected \n\n");
  117.             u32ModeSelect = MANCH_MODE2;
  118.             u32FrameByteCount = MODE2_FRAME_BYTECOUNT;
  119.             u32Idle = MODE2_IDLE;
  120.             u32Preamble = MODE2_PREAMBLE;
  121.             u32PreambleNum = MODE2_PREAMBLE_NUM;
  122. //            u32FrameEnd = MODE2_EOF;
  123.             break;
  124.         default:
  125.             u32ModeSelect = MANCH_NONE;
  126.             break;
  127.         }

  128.         if (u32ModeSelect == MANCH_NONE)
  129.         {
  130.             printf("MANCH: Stop testing \n");
  131.             break;
  132.         }

  133.         printf("  Please select encoded type:\n");
  134.         printf("    1: Thomas format \n");
  135.         printf("    2: IEEE802.3 format \n");
  136.         printf("    Other: Thomas format (default) \n\n");
  137.         u8Option = getchar();
  138.         switch(u8Option)
  139.         {
  140.         case '1':
  141.         default:
  142.             printf("  Thomas format selected \n\n");
  143.             u32EncodedType = MANCH_THOMAS;
  144.             break;
  145.         case '2':
  146.             printf("  IEEE802.3 format selected \n\n");
  147.             u32EncodedType = MANCH_IEEE8023;
  148.             break;
  149.         }

  150.         /*--------------------------------------------------------------------------------------*/
  151.         /* Clear RX buffer                                                                      */
  152.         /*--------------------------------------------------------------------------------------*/
  153.         /* Clear RX received data */
  154.         for (ii=0; ii<u32FrameByteCount; ii++)
  155.             g_rxBuf[ii] = 0;

  156.         /*--------------------------------------------------------------------------------------*/
  157.         /* Set MANCH TX and RX related format                                                   */
  158.         /*--------------------------------------------------------------------------------------*/
  159.         /* Open MANCH */
  160.         MANCH_Open(manch, MANCH_FREQ_IN_HZ);

  161.         /* Set MANCH to NONE mode before to set related format */
  162.         MANCH_SetMode(manch, MANCH_NONE);

  163.         /* Set encoded format */
  164.         if (u32EncodedType == MANCH_THOMAS)
  165.             MANCH_ENCODE_THOMAS(manch);
  166.         else
  167.             MANCH_ENCODE_IEEE8023(manch);

  168.         /* Set Frame number */
  169.         MANCH_SetFrameNum(manch, u32FrameByteCount);

  170.         /* Set Idle pattern */
  171.         MANCH_SetIdle(manch, u32Idle);

  172.         /* Set Preamble pattern */
  173.         MANCH_SetPreamble(manch, u32Preamble);

  174.         /* Set Preamble number */
  175.         MANCH_SetPreambleNum(manch, u32PreambleNum);

  176.         /* Set RX polarity */
  177.         MANCH_RX_NOT_INVERTED(manch);

  178.         /* Reset receive FIFO control */
  179.         MANCH_CLR_RX_FIFO(manch);
  180.         MANCH_NOTCLR_RX_FIFO(manch);

  181.         /* Clear Status register */
  182.         MANCH_CLR_STATUS(manch);

  183.         /*--------------------------------------------------------------------------------------*/
  184.         /* Set MANCH mode switch finally                                                        */
  185.         /*--------------------------------------------------------------------------------------*/
  186.         /* Disable RX DMA */
  187.         MANCH_DISABLE_RX_DMA(manch);

  188.         /* Set selected MANCH mode */
  189.         MANCH_SetMode(manch, u32ModeSelect);

  190.         /*--------------------------------------------------------------------------------------*/
  191.         /* Setup PDMA for MANCH RX                                                              */
  192.         /*--------------------------------------------------------------------------------------*/
  193.         /* Reset PDMA module */
  194.         SYS_ResetModule(PDMA_RST);

  195.         /* Enable PDMA channels */
  196.         PDMA_Open(pdma, 1<<MANCH_RX_PDMA_CH);

  197.         /*=======================================================================
  198.             MANCH RX PDMA channel configuration:
  199.           -----------------------------------------------------------------------
  200.               Word length = 8 bits
  201.               Transfer Count = u32FrameByteCount
  202.               Source = MANCH->RXDAT
  203.               Source Address = Fixed
  204.               Destination = g_rxBuf
  205.               Destination Address = Increased
  206.               Burst Type = Single Transfer
  207.          ========================================================================*/
  208.         /* Set transfer width (8 bits) and transfer count */
  209.         PDMA_SetTransferCnt(pdma, MANCH_RX_PDMA_CH, PDMA_WIDTH_8, u32FrameByteCount);
  210.         /* Set source/destination address and attributes */
  211.         PDMA_SetTransferAddr(pdma, MANCH_RX_PDMA_CH, (uint32_t)&manch->RXDAT, PDMA_SAR_FIX, (uint32_t)g_rxBuf, PDMA_DAR_INC);
  212.         /* Set request source; set basic mode. */
  213.         PDMA_SetTransferMode(pdma, MANCH_RX_PDMA_CH, PDMA_MANCH_RX, FALSE, 0);
  214.         /* Single request type; PDMA single request type. */
  215.         PDMA_SetBurstType(pdma, MANCH_RX_PDMA_CH, PDMA_REQ_SINGLE, 0);
  216.         /* Disable table interrupt */
  217.         PDMA->DSCT[MANCH_RX_PDMA_CH].CTL |= PDMA_DSCT_CTL_TBINTDIS_Msk;

  218.         /*--------------------------------------------------------------------------------------*/
  219.         /* Begin MANCH TX transfer                                                              */
  220.         /*--------------------------------------------------------------------------------------*/
  221.         /* Enable RX DMA */
  222.         MANCH_ENABLE_RX_DMA(manch);

  223.         /*--------------------------------------------------------------------------------------*/
  224.         /* Wait DMA finished                                                                    */
  225.         /*--------------------------------------------------------------------------------------*/
  226.         /* Wait RX PDMA finished */
  227.         u32TimeOutCount = SystemCoreClock;
  228.         while((PDMA->TDSTS & (1<<MANCH_RX_PDMA_CH))==0)
  229.         {
  230.             if(u32TimeOutCount == 0)
  231.             {
  232.                 printf("\nTimeout is happened, please check if something is wrong. \n");
  233.                 while(1);
  234.             }
  235.             u32TimeOutCount--;
  236.         }

  237.         /* Clear RX PDMA finished flag */
  238.         PDMA_CLR_TD_FLAG(PDMA, (1<<MANCH_RX_PDMA_CH));

  239.         /* Check and clear RX_DONE finished flag */
  240.         u32TimeOutCount = SystemCoreClock;
  241.         while(!MANCH_IS_RXFRAME_DONE(manch))
  242.         {
  243.             if(u32TimeOutCount == 0)
  244.             {
  245.                 printf("\nTimeout is happened, please check if something is wrong. \n");
  246.                 while(1);
  247.             }
  248.             u32TimeOutCount--;
  249.         }

  250.         MANCH_CLR_RXFRAME_DONE(manch);

  251.         /* Check received data */
  252.         pu8rx = g_rxBuf;

  253.         for (ii=0; ii<u32FrameByteCount; ii++)
  254.         {
  255.             printf("RX received data = 0x%x \n", *pu8rx);
  256.             pu8rx++;
  257.         }

  258.         /* Prepare to do another test */
  259.         printf("*** Prepare to do another RX test ***\n\n");
  260.     }
  261.     while(1);
  262. }

  263. void SYS_Init(void)
  264. {
  265.     /*--------------------------------------------------------------------------------------*/
  266.     /* Init System Clock                                                                    */
  267.     /*--------------------------------------------------------------------------------------*/
  268.     /* Enable Internal RC clock */
  269.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  270.     /* Waiting for Internal RC clock ready */
  271.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  272.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  273.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  274.     /* Enable UART module clock */
  275.     CLK_EnableModuleClock(UART0_MODULE);

  276.     /* Enable PDMA clock source */
  277.     CLK_EnableModuleClock(PDMA_MODULE);

  278.     /* Enable MANCH module clock */
  279.     CLK_EnableModuleClock(MANCH_MODULE);

  280.     /* Select UART module clock source */
  281.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

  282.     /*--------------------------------------------------------------------------------------*/
  283.     /* Init I/O Multi-function                                                              */
  284.     /*--------------------------------------------------------------------------------------*/
  285.     /* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
  286.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
  287.                     (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

  288.     /* Set PB multi-function pins for MANCH RXD=PB.6 and TXD=PB.7 */
  289.     SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB7MFP_Msk | SYS_GPB_MFPL_PB6MFP_Msk)) |
  290.                     (SYS_GPB_MFPL_PB7MFP_MANCH_TXD | SYS_GPB_MFPL_PB6MFP_MANCH_RXD);

  291. }

  292. void UART0_Init()
  293. {
  294.     /*--------------------------------------------------------------------------------------*/
  295.     /* Init UART                                                                            */
  296.     /*--------------------------------------------------------------------------------------*/
  297.     /* Configure UART0 and set UART0 baud rate */
  298.     UART_Open(UART0, 115200);
  299. }

  300. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/
 楼主| xinxianshi 发表于 2023-11-25 21:37 | 显示全部楼层
 楼主| xinxianshi 发表于 2023-11-25 21:38 | 显示全部楼层
 楼主| xinxianshi 发表于 2023-11-25 21:39 | 显示全部楼层
这个可是我第一个见到在单片机里集成这个接口的,新唐是第一个。
Kelan 发表于 2023-11-26 22:07 | 显示全部楼层
xinxianshi 发表于 2023-11-25 21:39
这个可是我第一个见到在单片机里集成这个接口的,新唐是第一个。

是哪个型号呢?
Stahan 发表于 2023-11-28 11:04 来自手机 | 显示全部楼层
这个接口是做什么应用的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

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