[技术贴] 【M0】 MG32F02A 学习笔记⑲ UART0 SPI模式

[复制链接]
146|1
 楼主 | 2018-11-16 16:12 | 显示全部楼层 |阅读模式
     上回我们说到了MG32F02A的TM36 输入捕获DMA的使用。帖子详情:http://bbs.21ic.com/icview-2585798-1-1.html

      这次用一下UART0作SPI试试。
      这次我是模拟UART0作为SPI主机模式,此处要注意的是,UART的数据格式要设置的和SPI从机格式一致。
  1. #include "MG32x02z_DRV.H"
  2. #include <stdio.h>

  3. #define URTX URT0

  4. typedef uint8_t u8;
  5. typedef uint16_t u16;
  6. typedef uint32_t u32;
  7. typedef uint64_t u64;

  8. void CSC_Init (void)
  9. {
  10.         CSC_PLL_TyprDef CSC_PLL_CFG;
  11.    
  12.        
  13.     UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  14.     MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  15.     ProtectModuleReg(MEMprotect);

  16.     UnProtectModuleReg(CSCprotect);
  17.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  18.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  19.        
  20.         /* CK_HS selection */
  21.         CSC_IHRCO_Select(IHRCO_11M0592Hz);                        // IHRCO Sel 11.0592MHz
  22.         CSC_IHRCO_Cmd(ENABLE);
  23.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  24.         CSC_ClearFlag(CSC_IHRCOF);
  25.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  26.         /* PLL */
  27.         /**********************************************************/
  28.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  29.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  30.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  31.         CSC_PLL_Config(&CSC_PLL_CFG);
  32.         CSC_PLL_Cmd(ENABLE);
  33.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  34.         CSC_ClearFlag(CSC_PLLF);
  35.         /**********************************************************/

  36.        
  37.         /* CK_MAIN */
  38.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  39.         /* Configure ICKO function */
  40.           
  41.         /* Configure peripheral clock */
  42.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  43.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
  44.         CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
  45.         CSC_PeriphOnModeClock_Config(CSC_ON_PortC,ENABLE);
  46.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);

  47.        
  48.     ProtectModuleReg(CSCprotect);
  49.    
  50. }

  51. void URT0_SPIMode_Init(void)
  52. {
  53.     URT_BRG_TypeDef  URT_BRG;
  54.     URT_Data_TypeDef DataDef;
  55.     PIN_InitTypeDef PINX_InitStruct;
  56.     //==Set CSC init
  57.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  58.     //Select CK_HS source = CK_IHRCO
  59.     //Select IHRCO = 11.0592M
  60.     //Select CK_MAIN Source = CK_HS
  61.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  62.     //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
  63.     //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
  64.    
  65.     //==Set GPIO init
  66.     //1. MOSI Pin
  67.     //    (1).MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8
  68.     //    (2).GPIO port initial is 0xFFFF
  69.     //    (3).Pin8 mode is PPO (Push pull output)
  70.     //    (4).Pin8 pull-up resister Enable
  71.     //    (5).Pin8 function URT0_TX
  72.     //2. MISO Pin
  73.     //    (1).MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin9
  74.     //    (2).GPIO port initial is 0xFFFF
  75.     //    (3).Pin8 mode is ODO (Open drain)
  76.     //    (4).Pin8 pull-up resister Enable
  77.     //    (5).Pin9 function URT0_RX
  78.     //3. SPICLK Pin
  79.     //    (1).MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOC->Pin3
  80.     //    (2).GPIO port initial is 0xFFFF
  81.     //    (3).Pin8 mode is PPO (Push pull output)
  82.     //    (4).Pin8 pull-up resister Enable
  83.     //    (5).Pin3 function URT0_CLK
  84.     //4. NSS Pin
  85.     //    (1).MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin10
  86.     //    (2).GPIO port initial is 0xFFFF
  87.     //    (3).Pin8 mode is PPO (Push pull output)
  88.     //    (4).Pin8 pull-up resister Enable
  89.     //    (5).Pin3 function URT0_NSS
  90.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
  91.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  92.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  93.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  94.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  95.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
  96.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_TX
  97.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD(MOSI) at PB8
  98.        
  99.         GPIO_PinMode_Config(PINB(10),&PINX_InitStruct);                                                          // URT0_NSS(SPI_NSS) at PB10
  100.        
  101.         GPIO_PinMode_Config(PINC(3),&PINX_InitStruct);                                                          // URT0_CLK(SPI_CLK) at PC3
  102.        
  103.         GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                                          // D6 at PE15

  104.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
  105.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_RX
  106.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD(MISO) at PB9  

  107.     //=====Set Clock=====//
  108.     //---Set BaudRate---//
  109.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
  110.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
  111.     URT_BRG.URT_PrescalerCounterReload = 3;                        //Set PSR
  112.     URT_BRG.URT_BaudRateCounterReload = 5;                        //Set RLR
  113.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                    //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
  114.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                    //Enable BaudRateGenerator
  115.     //---TX/RX Clock---//
  116.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);        //URT_TX use BaudRateGenerator
  117.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);        //URT_RX use BaudRateGenerator
  118.     URT_TXOverSamplingSampleNumber_Select(URTX, 3);                //Set TX OS_NUM
  119.     URT_RXOverSamplingSampleNumber_Select(URTX, 3);                //Set RX OS_NUM
  120.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
  121.     URT_TX_Cmd(URTX, ENABLE);                                    //Enable TX
  122.     URT_RX_Cmd(URTX, ENABLE);                                    //Enable RX
  123.    

  124.     //=====Set Mode=====//
  125.     //---Set Data character config---//
  126.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
  127.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
  128.     DataDef.URT_TX_DataOrder   = URT_DataTyped_MSB;      //UART SPI Data Mode
  129.     DataDef.URT_RX_DataOrder   = URT_DataTyped_MSB;      //UART SPI Data Mode
  130.     DataDef.URT_TX_Parity      = URT_Parity_No;
  131.     DataDef.URT_RX_Parity      = URT_Parity_No;
  132.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
  133.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
  134.     DataDef.URT_TX_DataInverse = DISABLE;
  135.     DataDef.URT_RX_DataInverse = DISABLE;
  136.     URT_DataCharacter_Config(URTX, &DataDef);
  137.     //---Set Mode Select---//
  138.     URT_Mode_Select(URTX, URT_SYNC_mode);
  139.     //---Set DataLine Select---//
  140.     URT_DataLine_Select(URTX, URT_DataLine_2);
  141.    
  142.     //=====Set Error Control=====//
  143.     // to do...
  144.    
  145.     //=====Set Bus Status Detect Control=====//
  146.     // to do...
  147.    
  148.     //==Set SPI Mode(CPHA = 0 , CPOL = 0)====//
  149.     URT_CPHAMode_Select( URTX , URT_CPHA0_LeadEdge);
  150.     URT_CPOLMode_Select( URTX , URT_CPOL0_Low );

  151.     //=====Set Data Control=====//
  152.     URT_TXGaudTime_Select(URTX, 0);
  153.    
  154.    
  155.     //=====Enable CLK(SYSCLK)====//
  156.     URT_CLKSignal_Cmd(URTX,ENABLE);
  157.    
  158.     //=====Enable URT=====//
  159.     URT_Cmd(URTX, ENABLE);

  160. }

  161. int main()
  162. {
  163.         int i;
  164.         ctype            URT_RecData;
  165.         CSC_Init();
  166.         URT0_SPIMode_Init();
  167.        
  168.                 while(1)
  169.         {
  170.                     i++;
  171.             if(i>=500000)
  172.             {
  173.                                 i=0;
  174.     URT_SetTXData(URTX,1,0x30);
  175.     while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  176.     URT_ClearITFlag(URTX,URT_IT_TC);
  177.     URT_RecData.W = URT_GetRXData(URTX);      //Receive effective data byte is equal to send data byte.
  178.                 if(URT_RecData.W==0x30)PE15=~PE15;
  179.                         }
  180.         }

  181. }
复制代码


| 2018-11-17 08:46 | 显示全部楼层
谢谢分享
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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