[范例教程] 【M0】 MG32F02A 学习笔记⑳ IIC主机模式

[复制链接]
1581|0
 楼主| noctor 发表于 2018-11-20 13:08 | 显示全部楼层 |阅读模式
     上回我们说到了MG32F02A的UART0 SPI的使用。帖子详情:https://bbs.21ic.com/icview-2586596-1-1.html

      突然发现原来IIC还没挂上来。。
由于代码比较多,就先只挂主机的吧:

  1. #include "MG32x02z_DRV.H"
  2. #include "iic.h"
  3. #include <stdio.h>
  4. #include "MG32x02z_I2C_DRV.h"

  5. I2C_Struct* I2Cx;

  6. typedef uint8_t u8;
  7. typedef uint16_t u16;
  8. typedef uint32_t u32;
  9. typedef uint64_t u64;

  10. #define URTX URT0
  11. #define MYBINARYIMAGE2_LENGTH 20

  12. I2C_HandleTypeDef gSI2C0_Handle;
  13. I2C_HandleTypeDef gSI2C1_Handle;

  14. uint8_t SendBuf[MYBINARYIMAGE2_LENGTH]={0};
  15. uint8_t const String0[] = {"Wel"};
  16. uint8_t lDataBuffer[80];

  17. void SysTick_Handler(void)
  18. {
  19.     //to do......
  20.         IncTick();
  21. }

  22. void CSC_Init (void)
  23. {
  24.         CSC_PLL_TyprDef CSC_PLL_CFG;
  25.    
  26.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  27.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  28.   ProtectModuleReg(MEMprotect);

  29.   UnProtectModuleReg(CSCprotect);
  30.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  31.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  32.        
  33.         /* CK_HS selection */
  34.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  35.         CSC_IHRCO_Cmd(ENABLE);
  36.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  37.         CSC_ClearFlag(CSC_IHRCOF);
  38.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  39.         /* PLL */
  40.         /**********************************************************/
  41.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  42.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  43.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  44.         CSC_PLL_Config(&CSC_PLL_CFG);
  45.         CSC_PLL_Cmd(ENABLE);
  46.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  47.         CSC_ClearFlag(CSC_PLLF);
  48.         /**********************************************************/

  49.        
  50.         /* CK_MAIN */
  51.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  52.         /* Configure ICKO function */
  53.                
  54.         /* Configure peripheral clock */
  55.         CSC_PeriphProcessClockSource_Config(CSC_I2C0_CKS, CK_APB);
  56.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  57.         CSC_PeriphOnModeClock_Config(CSC_ON_I2C0,ENABLE);
  58.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
  59.         CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
  60.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);
  61.        
  62.   ProtectModuleReg(CSCprotect);
  63.    
  64. }


  65. void I2C0_ByteMode_Master_Init(void)
  66. {
  67.     I2C_InitTypeDef SI2C0_Init;

  68.     SI2C0_Init.Instance = I2C0;
  69.     SI2C0_Init.CK_I2C_PR_Frequency = 12000000;
  70.     SI2C0_Init.SCL_Clock = 400000;   
  71.     I2C_ByteMode_Init(&SI2C0_Init);

  72.     gSI2C0_Handle.Instance = I2C0;
  73.     printf("I2C_IsDeviceReady\n\r");
  74.        
  75.                                
  76. }

  77. DRV_Return I2C_ByteMode_Init(I2C_InitTypeDef *SI2C)
  78. {

  79.     uint16_t lI2C_Pre = 1;
  80.     uint16_t lI2C_DIV = 1;
  81.     uint16_t lI2C_HT_LT = 0;
  82.     uint16_t lI2C_LT;
  83.     uint16_t lI2C_HT;
  84.                 PIN_InitTypeDef PINX_InitStruct;
  85.     //===== Check I2C Busy =====//
  86.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF))
  87.         return DRV_Busy;

  88.     __I2C_Disable(SI2C->Instance);

  89.     //===== GPIO Initial =====//
  90.       //===== CSC for GPIO Config =====//
  91.     UnProtectModuleReg(CSCprotect);                                             // Unprotect CSC module
  92.     CSC_PeriphOnModeClock_Config(CSC_ON_PortB, ENABLE);                                    // Enable PortB clock

  93.     ProtectModuleReg(CSCprotect);                                               // protect CSC module

  94. //      //===== GPIO Config =====//
  95.     PINX_InitStruct.PINX_Mode                    = PINX_Mode_OpenDrain_O;            // Pin select pusu pull mode
  96.     PINX_InitStruct.PINX_PUResistant        = PINX_PUResistant_Enable;         // Enable pull up resistor
  97.     PINX_InitStruct.PINX_Speed              = PINX_Speed_High;           
  98.     PINX_InitStruct.PINX_OUTDrive           = PINX_OUTDrive_Level0;             // Pin output driver full strength.
  99.     PINX_InitStruct.PINX_FilterDivider      = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  100.     PINX_InitStruct.PINX_Inverse            = PINX_Inverse_Disable;             // Pin input data not inverse
  101.     PINX_InitStruct.PINX_Alternate_Function = 2;                                // Pin AFS = 2

  102.     if(SI2C->Instance == I2C0)
  103.     {
  104.         GPIO_PinMode_Config(PINB(10),&PINX_InitStruct);                         // I2C0 SCL setup at PB10
  105.         GPIO_PinMode_Config(PINB(11),&PINX_InitStruct);                         // I2C0 SDA setup at PB11

  106. //       GPIO_PinMode_Config(PINC(4),&PINX_InitStruct);                          // I2C0 SCL setup at PC4
  107. //       GPIO_PinMode_Config(PINC(5),&PINX_InitStruct);                          // I2C0 SDA setup at PC5

  108. //       GPIO_PinMode_Config(PINC(8),&PINX_InitStruct);                          // I2C0 SCL setup at PC8
  109. //       GPIO_PinMode_Config(PINC(9),&PINX_InitStruct);                          // I2C0 SDA setup at PC9

  110. //       GPIO_PinMode_Config(PIND(5),&PINX_InitStruct);                          // I2C0 SCL setup at PD5
  111. //       GPIO_PinMode_Config(PIND(6),&PINX_InitStruct);                          // I2C0 SDA setup at PD6

  112. //       GPIO_PinMode_Config(PINE(0),&PINX_InitStruct);                          // I2C0 SCL setup at PE0
  113. //       GPIO_PinMode_Config(PINE(1),&PINX_InitStruct);                          // I2C0 SDA setup at PE1
  114.     }

  115.     if(SI2C->Instance == I2C1)
  116.     {
  117.         GPIO_PinMode_Config(PINC(10),&PINX_InitStruct);                         // I2C1 SCL setup at PC10
  118.         GPIO_PinMode_Config(PINC(11),&PINX_InitStruct);                         // I2C1 SDA setup at PC11

  119.         GPIO_PinMode_Config(PIND(8),&PINX_InitStruct);                          // I2C1 SCL setup at PD8
  120.         GPIO_PinMode_Config(PIND(9),&PINX_InitStruct);                          // I2C1 SDA setup at PD9

  121.         GPIO_PinMode_Config(PINE(2),&PINX_InitStruct);                          // I2C1 SCL setup at PE2
  122.         GPIO_PinMode_Config(PINE(3),&PINX_InitStruct);                          // I2C1 SDA setup at PE3
  123.     }

  124.     //===== I2C Initial =====//
  125.       //=== CSC for I2C Config ===//
  126.     UnProtectModuleReg(CSCprotect);                                             // Unprotect CSC module
  127.     if(SI2C->Instance == I2C0)
  128.                        
  129.         CSC_PeriphOnModeClock_Config(CSC_ON_I2C0, ENABLE);                      // Enable I2C0 module clock
  130.     if(SI2C->Instance == I2C1)
  131.         CSC_PeriphOnModeClock_Config(CSC_ON_I2C1, ENABLE);                      // Enable I2C1 module clock
  132.     ProtectModuleReg(CSCprotect);                                               // protect CSC module

  133.       //=== I2C Config ===//
  134.     //===== I2C Output Clock Config =====//
  135.     // CK_I2C_PR
  136.     // SCL Output Clock
  137.     // HT + LT, <= 32 >=9, CK_I2C_PR / SCL Clock / Prescaler / DIV

  138.     do{
  139.         lI2C_HT_LT = SI2C->CK_I2C_PR_Frequency / SI2C->SCL_Clock / lI2C_Pre / lI2C_DIV;
  140.         if((lI2C_HT_LT >= 32) || (lI2C_HT_LT <=9))
  141.         {
  142.             lI2C_Pre ++;
  143.             if(lI2C_Pre > 8)
  144.             {
  145.                 lI2C_Pre = 1;
  146.                 lI2C_DIV ++;
  147.             }
  148.         }
  149.     }while((lI2C_HT_LT >= 32) || (lI2C_HT_LT <=9));

  150.     lI2C_LT = (lI2C_HT_LT >> 1);
  151.     lI2C_HT = lI2C_HT_LT - lI2C_LT;

  152.     __I2C_SetClockSource(SI2C->Instance, I2C_CLK_SRC_PROC);
  153.     __I2C_SetClockPrescaler(SI2C->Instance, lI2C_Pre - 1);
  154.     __I2C_SetClockDivider(SI2C->Instance, lI2C_DIV - 1);
  155.     __I2C_SetSCLHighTime(SI2C->Instance, lI2C_HT - 1);
  156.     __I2C_SetSCLLowTime(SI2C->Instance, lI2C_HT - 1);

  157.     //===== I2C Opration Mode Config =====//
  158.     __I2C_GeneralCallAddress_Disable(SI2C->Instance);
  159.     __I2C_SlaveAddressDetect_Disable(SI2C->Instance, (I2C_SADR_1 | I2C_SADR_2));
  160.    
  161.     //===== I2C Interrupt Config =====//
  162.     if(SI2C->Instance == I2C0)
  163.     {
  164.         NVIC_EnableIRQ(I2C0_IRQn);
  165.         NVIC_SetPriority(I2C0_IRQn, 1);                                         // Suggest SYSTICK Priority = 0
  166.                                                                                 //           Other Priority > 0
  167.     }

  168.     if(SI2C->Instance == I2C1)
  169.     {
  170.         NVIC_EnableIRQ(I2Cx_IRQn);
  171.         NVIC_SetPriority(I2Cx_IRQn, 1);                                         // Suggest SYSTICK Priority = 0
  172.                                                                                 //           Other Priority > 0
  173.     }

  174.     __I2C_ITEA_Disable(SI2C->Instance);
  175.     __I2C_IT_Disable(SI2C->Instance, (I2C_IT_TMOUT | I2C_IT_EVENT | I2C_IT_ERR | I2C_IT_BUF | I2C_IT_WUP));
  176.                


  177.     //===== I2C Timeout Config =====//
  178.     __I2C_TMO_Disable(SI2C->Instance);
  179.     __I2C_SetTimeOutClockSource(SI2C->Instance, I2C_TMO_CKS_DIV64);
  180.     __I2C_SetTimeOutDetectionMode(SI2C->Instance, I2C_TMO_MDS_GENERAL);
  181.     __I2C_SetTimeOutCount(SI2C->Instance, I2C_TMO_MDS_GENERAL);

  182.     //===== I2C Enable =====//
  183.     __I2C_Enable(SI2C->Instance);
  184.         //        I2Cx->CR0.B[0] |= I2C_CR0_BUF_EN_enable_b0;
  185.     return DRV_Success;
  186. }

  187. void I2C_Delay(uint32_t Delay)
  188. {

  189.        
  190. }

  191. DRV_Return I2C_IsDeviceReady(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint32_t Trials)
  192. {
  193. //-----Check I2C Busy ------------------
  194.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  195.         return DRV_Busy;

  196. //-----Set_Config-----------------------
  197.     SI2C->State.W = 0;
  198.     SI2C->SlaveAddress = DevAddress & 0xFFFE;
  199.     SI2C->pData = 0x00000000;
  200.     SI2C->Count = 0;
  201.     SI2C->Control.W = I2C_XferNext_STOP;

  202. //-----Start----------------------------
  203.     do{
  204.         SI2C->State.W = 0;
  205.         Set_STA_STO_AA_100(SI2C->Instance);
  206.         do{
  207.             I2C_ByteMode_Handle(SI2C);
  208.         }while(SI2C->State.MBit.Done == 0);

  209.         if((SI2C->State.W & (I2C_State_BusError | \
  210.                                    I2C_State_ArbitrationLost | \
  211.                                    I2C_State_NACK)) == 0)
  212.             return DRV_Success;

  213.         I2C_Delay(1);
  214.         
  215.     }while(-- Trials > 0);

  216.     return DRV_Failure;
  217. }

  218. void I2C_ByteMode_Handle(I2C_HandleTypeDef *SI2C)
  219. {
  220.     uint8_t lState;

  221.     if(__I2C_GetStateFlag(SI2C->Instance) == 0)
  222.         return;

  223.     lState = __I2C_GetStatusCode(SI2C->Instance);
  224.     switch(lState){
  225.         case 0x00:  // Bus Error
  226.             SI2C->State.W |= I2C_State_BusError | \
  227.                                    I2C_State_Done;;
  228.             break;

  229.         case 0x08:  // SLA+W sent and ACK received
  230.         case 0x10:  // Repeated start condition
  231.             Set_STA_STO_AA_000(SI2C->Instance);
  232.             __I2C_SendSBUF(SI2C->Instance, ((uint8_t)SI2C->SlaveAddress));
  233.             break;

  234.         case 0x18:  // MT SLA+W sent and ACK received
  235.         case 0x28:  // MT DATA sent and ACK received
  236.             if(SI2C->Count == 0)
  237.             {
  238.                 Set_STA_STO_AA_010(SI2C->Instance);
  239.                 __I2C_ClearStateFlag(SI2C->Instance);
  240.                 while(__I2C_GetStatusCode(SI2C->Instance) == lState);
  241.                 lState = __I2C_GetStatusCode(SI2C->Instance);
  242.                 SI2C->State.W |= I2C_State_Done;
  243.                 return;
  244.             }
  245.             __I2C_SendSBUF(SI2C->Instance, ((uint8_t)*SI2C->pData));
  246.             SI2C->pData ++;
  247.             SI2C->Count --;
  248.             break;

  249.         case 0x20:  // MT SLA+W sent NACK received
  250.         case 0x30:  // MT DATA sent NACK received
  251.         case 0x48:  // MR SLA+R sent NACK received
  252.             Set_STA_STO_AA_010(SI2C->Instance);
  253.             __I2C_ClearStateFlag(SI2C->Instance);
  254.             while(__I2C_GetStatusCode(SI2C->Instance) == lState);
  255.             lState = __I2C_GetStatusCode(SI2C->Instance);
  256.             SI2C->State.W |= I2C_State_NACK | \
  257.                                    I2C_State_Done;
  258.             return;

  259.         case 0x38:  // Arbitration lost
  260.             Set_STA_STO_AA_000(SI2C->Instance);
  261.             SI2C->State.W |= I2C_State_ArbitrationLost | \
  262.                                    I2C_State_Done;
  263.             break;

  264.         case 0x40:  // SLA+R sent and ACK received
  265.             Set_STA_STO_AA_001(SI2C->Instance);
  266.         case 0x50:  // Data Received and ACK sent
  267.             if(SI2C->Count <= 1)
  268.                 Set_STA_STO_AA_000(SI2C->Instance);
  269.             *SI2C->pData = __I2C_ReceiveSBUF(SI2C->Instance);
  270.             SI2C->Count--;
  271.             SI2C->pData++;
  272.             break;

  273.         case 0x58:  // Data Received and NACK sent
  274.             if((SI2C->Control.W & I2C_XferNext_Mask) == I2C_XferNext_RepeatStart)
  275.                 Set_STA_STO_AA_100(SI2C->Instance);
  276.             else
  277.                 Set_STA_STO_AA_010(SI2C->Instance);

  278.             SI2C->State.W |= I2C_State_Done;
  279.             break;

  280. //-------------------------------------
  281.         case 0x60:  // Own SLA+W has bee Received ACK has been returned

  282.         case 0x68:  // Arbitration lost in SLA+R/W as master,
  283.                     // Own SLA+W has been Received ACK has bee returned

  284.         case 0x70:  // General Call address has been received ACK has been returned

  285.         case 0x78:  // Arbitration lost in SLA+R/W as master,
  286.                     // General Call address has been received ACK has been returned

  287.         case 0x80:  // Data byte has been received ACK has been return

  288.         case 0x88:  // Data byte has been received Not ACK has been return

  289.         case 0x90:  // Previously address with General Call address
  290.                     // Data byte has been received ACK has been return

  291.         case 0x98:  // Previously address with General Call address
  292.                     // Data byte has been received Not ACK has been return

  293.         case 0xA0:  // A STOP or repeated START has been received while will addressed as SLV/REC

  294.         case 0xA8:  // Own SLA+R has bee Received ACK has been returned

  295.         case 0xB0:  // Arbitration lost in SLA+R/W as master,
  296.                     // Own SLA+R has been Received ACK has bee returned

  297.         case 0xB8:  // Data byte in SIDAT has been transmitted ACK has been received

  298.         case 0xC0:  // Data byte or Last data byte in SIDAT has been transmitted Not ACK has been received

  299.         case 0xC8:  // Last Data byte in SIDAT has been transmitted ACK has been received

  300.         case 0xD0:
  301.         case 0xD8:
  302.         case 0xE0:
  303.         case 0xE8:
  304.         case 0xF0:
  305.                     
  306.         case 0xF8:  // Bus Idle

  307.         default:
  308.             break;
  309.     }
  310.     __I2C_ClearStateFlag(SI2C->Instance);
  311.     while(__I2C_GetStateFlag(SI2C->Instance) != 0);
  312. }

  313. DRV_Return I2C_ByteMode_MasterTransmit(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
  314. {
  315. //-----Check----------------------------
  316.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  317.         return DRV_Busy;

  318. //-----Set_Config-----------------------
  319.     SI2C->State.W = 0;
  320.     SI2C->SlaveAddress = DevAddress & 0xFFFE;
  321.     SI2C->pData = pData;
  322.     SI2C->Count = Lenth;
  323.     SI2C->Control.W = I2C_XferNext_STOP;

  324. //-----Start----------------------------
  325.     Set_STA_STO_AA_100(SI2C->Instance);
  326.     do{
  327.         I2C_ByteMode_Handle(SI2C);
  328.     }while(SI2C->State.MBit.Done == 0);

  329.     if((SI2C->State.W & (I2C_State_BusError | \
  330.                                I2C_State_ArbitrationLost | \
  331.                                I2C_State_NACK)) != 0)
  332.         return DRV_Failure;

  333.     return DRV_Success;
  334. }

  335. DRV_Return I2C_ByteMode_MasterReceive(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
  336. {
  337. //-----Check----------------------------
  338.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  339.         return DRV_Busy;

  340. //-----Set_Config-----------------------
  341.     SI2C->State.W = 0;
  342.     SI2C->SlaveAddress = DevAddress | 0x0001;
  343.     SI2C->pData = pData;
  344.     SI2C->Count = Lenth;
  345.     SI2C->Control.W = I2C_XferNext_STOP;

  346. //-----Start----------------------------
  347.     Set_STA_STO_AA_100(SI2C->Instance);
  348.     do{
  349.         I2C_ByteMode_Handle(SI2C);
  350.     }while(SI2C->State.MBit.Done == 0);

  351.     if((SI2C->State.W & (I2C_State_BusError | \
  352.                                I2C_State_ArbitrationLost | \
  353.                                I2C_State_NACK)) != 0)
  354.         return DRV_Failure;

  355.     return DRV_Success;
  356.                
  357. }

  358. void Sample_URT0_Init(void)
  359. {
  360.     URT_BRG_TypeDef  URT_BRG;
  361.     URT_Data_TypeDef DataDef;
  362.             PIN_InitTypeDef PINX_InitStruct;
  363.     //==Set CSC init
  364.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  365.     //Select CK_HS source = CK_IHRCO
  366.     //Select IHRCO = 11.0592M
  367.     //Select CK_MAIN Source = CK_HS
  368.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  369.     //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
  370.     //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
  371.    
  372.     //==Set GPIO init
  373.     //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8/9
  374.     //GPIO port initial is 0xFFFF
  375.     //Pin8 mode is PPO/Pin9 mode is ODO
  376.     //Pin8/9 pull-up resister Enable
  377.     //Pin8/9 function URT0_TX/RX
  378.   PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
  379.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  380.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  381.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  382.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  383.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
  384.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_TX
  385.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD at PB8

  386.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
  387.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_RX
  388.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD at PB9  
  389.        
  390.        
  391.    
  392.     //=====Set Clock=====//
  393.     //---Set BaudRate---//
  394.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
  395.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
  396.     URT_BRG.URT_PrescalerCounterReload = 0;                        //Set PSR
  397.     URT_BRG.URT_BaudRateCounterReload = 3;                        //Set RLR
  398.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                    //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
  399.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                    //Enable BaudRateGenerator
  400.     //---TX/RX Clock---//
  401.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);        //URT_TX use BaudRateGenerator
  402.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);        //URT_RX use BaudRateGenerator
  403.     URT_TXOverSamplingSampleNumber_Select(URTX, 25);                //Set TX OS_NUM
  404.     URT_RXOverSamplingSampleNumber_Select(URTX, 25);                //Set RX OS_NUM
  405.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
  406.     URT_TX_Cmd(URTX, ENABLE);                                    //Enable TX
  407.     URT_RX_Cmd(URTX, ENABLE);                                    //Enable RX
  408.    
  409.    

  410.     //=====Set Mode=====//
  411.     //---Set Data character config---//
  412.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
  413.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
  414.     DataDef.URT_TX_DataOrder   = URT_DataTyped_LSB;
  415.     DataDef.URT_RX_DataOrder   = URT_DataTyped_LSB;
  416.     DataDef.URT_TX_Parity      = URT_Parity_No;
  417.     DataDef.URT_RX_Parity      = URT_Parity_No;
  418.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
  419.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
  420.     DataDef.URT_TX_DataInverse = DISABLE;
  421.     DataDef.URT_RX_DataInverse = DISABLE;
  422.     URT_DataCharacter_Config(URTX, &DataDef);
  423.     //---Set Mode Select---//
  424.     URT_Mode_Select(URTX, URT_URT_mode);
  425.     //---Set DataLine Select---//
  426.     URT_DataLine_Select(URTX, URT_DataLine_2);
  427.    
  428.     //=====Set Error Control=====//
  429.     // to do...
  430.    
  431.     //=====Set Bus Status Detect Control=====//
  432.     // to do...
  433.    
  434.     //=====Set Data Control=====//
  435.     URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
  436.     URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
  437.     URT_TXGaudTime_Select(URTX, 0);
  438.    
  439.     //=====Enable URT Interrupt=====//
  440.     URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
  441.     URT_ITEA_Cmd(URTX, ENABLE);
  442.     NVIC_EnableIRQ(URT0_IRQn);

  443.     //=====Enable URT=====//
  444.     URT_Cmd(URTX, ENABLE);
  445.                
  446.         //==See MG32x02z_URT0_IRQ.c when interrupt in
  447. }

  448. int fputc(int ch,FILE *f)
  449. {
  450.        
  451.         URT_SetTXData(URTX,1,ch);
  452.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  453.         URT_ClearITFlag(URTX,URT_IT_TC);
  454.        
  455.         return ch;
  456. }

  457. void UartSendByte(int ch)
  458. {
  459.        
  460.         URT_SetTXData(URTX,1,ch);
  461.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  462.         URT_ClearITFlag(URTX,URT_IT_TC);
  463.        
  464. }

  465. void DMA_Init(void)
  466. {
  467.          DMA_BaseInitTypeDef DMATestPattern;

  468.     // ------------------------------------------------------------------------
  469.     // 1.Enable DMA
  470.     DMA_Cmd(ENABLE);
  471.    
  472.     // ------------------------------------------------------------------------
  473.     // 2.Enable Channel0
  474.     DMA_Channel_Cmd(DMAChannel0, ENABLE);
  475.    
  476.     // ------------------------------------------------------------------------
  477.     DMA_BaseInitStructure_Init(&DMATestPattern);
  478.    
  479.     // 3.initial & modify parameter
  480.       
  481.         // DMA channel select
  482.         DMATestPattern.DMAChx = DMAChannel0;
  483.         
  484.         // channel x source/destination auto increase address
  485.         DMATestPattern.SrcSINCSel = ENABLE;
  486.         DMATestPattern.DestDINCSel = DISABLE;
  487.         
  488.         // DMA source peripheral config
  489.         DMATestPattern.SrcSymSel = DMA_MEM_Read;
  490.         
  491.         // DMA destination peripheral config
  492.         DMATestPattern.DestSymSel = DMA_SPI0_TX;
  493.         
  494.         // DMA Burst size config
  495.         DMATestPattern.BurstDataSize = DMA_BurstSize_1Byte;
  496.         
  497.         // DMA transfer data count initial number
  498.         DMATestPattern.DMATransferNUM = MYBINARYIMAGE2_LENGTH;
  499.    
  500.         // source/destination config
  501.         DMATestPattern.DMASourceAddr = (uint32_t *)&SendBuf;
  502.         DMATestPattern.DMADestinationAddr = &SPI0->TDAT;//DMA_URT0_TX;// (uint8_t *)&RcvBuf;
  503.                                
  504.                                 SPI_DMASend_Cmd(SPI0, ENABLE);
  505.                                 DMA_Channel_Cmd(DMAChannel0, ENABLE);
  506.                                 DMA_Base_Init(&DMATestPattern);
  507. }


  508. int main()
  509. {
  510.         u32 i;
  511.         char RxData;
  512.         uint8_t AddrTemp;
  513.         PIN_InitTypeDef PINX_InitStruct;
  514.         CSC_Init();
  515.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;          // Pin select digital input mode
  516.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;  // Enable pull up resistor
  517.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  518.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;         // Pin output driver full strength.
  519.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
  520.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;         // Pin input data not inverse
  521.         PINX_InitStruct.PINX_Alternate_Function = 0;                                                 // Pin AFS = 0
  522.         GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                          // D6 setup at PE15
  523.         Sample_URT0_Init();
  524.         printf("hello\n");
  525.         I2C0_ByteMode_Master_Init();
  526.         i=0;
  527.     while(1)
  528.     {
  529.                   
  530.             i++;
  531.             if(i>=500000)
  532.             {
  533.                                 i=0;
  534.                                 PE15=0;

  535.       if(I2C_IsDeviceReady(&gSI2C0_Handle, 0xA0, 10) != DRV_Success)
  536.       printf("Target device is not ready\n\r");

  537.                   if(I2C_ByteMode_MasterTransmit(&gSI2C0_Handle, 0xA0, (uint8_t *)String0, (sizeof(String0)-1)) != DRV_Success)
  538.       printf("Mater transmited data fail\n\r");
  539.                                
  540.                         if(I2C_ByteMode_MasterReceive(&gSI2C0_Handle, (uint16_t)0xA0, (uint8_t *)lDataBuffer, (sizeof(String0)-1)) != DRV_Success)
  541.       printf("Mater received data fail\n\r");
  542.                                 RxData=I2C_ReceiveSBUF(I2C0);
  543.                                 printf("receive:0x%02X\n",RxData);
  544.                 PE15=1;                       
  545.                         }
  546.     }
  547. }



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

本版积分规则

26

主题

82

帖子

3

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