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

[复制链接]
1521|0
 楼主| noctor 发表于 2018-11-22 09:05 | 显示全部楼层 |阅读模式
     上回我们说到了MG32F02A的IIC主机的使用。帖子详情:https://bbs.21ic.com/icview-2588642-1-1.html

      这次该说从机了。

      其实从机与主机区别不大,只是在初始化多一小段代码

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

  4. I2C_Struct* I2Cx;

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

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

  11. I2C_HandleTypeDef gSI2C0_Handle;
  12. I2C_HandleTypeDef gSI2C1_Handle;

  13. uint8_t SendBuf[MYBINARYIMAGE2_LENGTH]={0};//__attribute__((at(0x20001000)));
  14. //uint8_t RcvBuf[MYBINARYIMAGE2_LENGTH] __attribute__((at(0x20003800)));
  15. uint8_t const String0[] = {"X"};
  16. uint8_t lDataBuffer[80];

  17. void CSC_Init (void)
  18. {
  19.         CSC_PLL_TyprDef CSC_PLL_CFG;
  20.    
  21.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  22.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  23.   ProtectModuleReg(MEMprotect);

  24.   UnProtectModuleReg(CSCprotect);
  25.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  26.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  27.        
  28.         /* CK_HS selection */
  29.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  30.         CSC_IHRCO_Cmd(ENABLE);
  31.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  32.         CSC_ClearFlag(CSC_IHRCOF);
  33.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


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

  44.        
  45.         /* CK_MAIN */
  46.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  47.         /* Configure ICKO function */
  48.                
  49.         /* Configure peripheral clock */
  50.         CSC_PeriphProcessClockSource_Config(CSC_I2C0_CKS, CK_APB);
  51.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  52.         CSC_PeriphOnModeClock_Config(CSC_ON_I2C0,ENABLE);
  53.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
  54.         CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
  55.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);
  56.        
  57.   ProtectModuleReg(CSCprotect);
  58.    
  59. }


  60. void I2C0_ByteMode_Slave_Init(void)
  61. {
  62.     I2C_InitTypeDef SI2C0_Init;

  63.     SI2C0_Init.Instance = I2C0;
  64.     SI2C0_Init.CK_I2C_PR_Frequency = 12000000;
  65.     SI2C0_Init.SCL_Clock = 400000;   
  66.     I2C_ByteMode_Init(&SI2C0_Init);
  67.     gSI2C0_Handle.Instance = I2C0;
  68.     printf("I2C_SlaveDeviceReady\n\r");
  69.                
  70.                 Set_STA_STO_AA_001(I2C0);
  71.                                
  72. }

  73. DRV_Return I2C_ByteMode_Init(I2C_InitTypeDef *SI2C)
  74. {
  75. //    PIN_InitTypeDef PINX_InitStruct;
  76.     uint16_t lI2C_Pre = 1;
  77.     uint16_t lI2C_DIV = 1;
  78.     uint16_t lI2C_HT_LT = 0;
  79.     uint16_t lI2C_LT;
  80.     uint16_t lI2C_HT;
  81.                 PIN_InitTypeDef PINX_InitStruct;
  82.     //===== Check I2C Busy =====//
  83.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF))
  84.         return DRV_Busy;

  85.     __I2C_Disable(SI2C->Instance);

  86. //    //===== GPIO Initial =====//
  87. //      //===== CSC for GPIO Config =====//
  88.     UnProtectModuleReg(CSCprotect);                                             // Unprotect CSC module
  89.     CSC_PeriphOnModeClock_Config(CSC_ON_PortB, ENABLE);                                    // Enable PortB clock

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

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

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


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

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

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

  109. //       GPIO_PinMode_Config(PINE(0),&PINX_InitStruct);                          // I2C0 SCL setup at PE0
  110. //       GPIO_PinMode_Config(PINE(1),&PINX_InitStruct);                          // I2C0 SDA setup at PE1
  111.     }

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

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

  118.         GPIO_PinMode_Config(PINE(2),&PINX_InitStruct);                          // I2C1 SCL setup at PE2
  119.         GPIO_PinMode_Config(PINE(3),&PINX_InitStruct);                          // I2C1 SDA setup at PE3
  120.     }

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

  130.       //=== I2C Config ===//
  131.     //===== I2C Output Clock Config =====//
  132.     // CK_I2C_PR
  133.     // SCL Output Clock
  134.     // HT + LT, <= 32 >=9, CK_I2C_PR / SCL Clock / Prescaler / DIV

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

  147.     lI2C_LT = (lI2C_HT_LT >> 1);
  148.     lI2C_HT = lI2C_HT_LT - lI2C_LT;

  149.     __I2C_SetClockSource(SI2C->Instance, I2C_CLK_SRC_PROC);
  150.     __I2C_SetClockPrescaler(SI2C->Instance, lI2C_Pre - 1);
  151.     __I2C_SetClockDivider(SI2C->Instance, lI2C_DIV - 1);
  152.     __I2C_SetSCLHighTime(SI2C->Instance, lI2C_HT - 1);
  153.     __I2C_SetSCLLowTime(SI2C->Instance, lI2C_HT - 1);

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

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

  172.     __I2C_ITEA_Disable(SI2C->Instance);
  173.     __I2C_IT_Disable(SI2C->Instance, (I2C_IT_TMOUT | I2C_IT_EVENT | I2C_IT_ERR | I2C_IT_BUF | I2C_IT_WUP));

  174.     __I2C_IT_Enable(SI2C->Instance, ( I2C_IT_EVENT ));
  175.     __I2C_ITEA_Enable(SI2C->Instance);

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

  188. void I2C_Delay(uint32_t Delay)
  189. {
  190.         int i;
  191.            while(i*10)
  192.    {
  193.      i--;
  194.    }
  195.        
  196. }

  197. DRV_Return I2C_IsDeviceReady(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint32_t Trials)
  198. {
  199. //-----Check I2C Busy ------------------
  200.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  201.         return DRV_Busy;

  202. //-----Set_Config-----------------------
  203.     SI2C->State.W = 0;
  204.     SI2C->SlaveAddress = DevAddress & 0xFFFE;
  205.     SI2C->pData = 0x00000000;
  206.     SI2C->Count = 0;
  207.     SI2C->Control.W = I2C_XferNext_STOP;

  208. //-----Start----------------------------
  209.     do{
  210.         SI2C->State.W = 0;
  211.         Set_STA_STO_AA_100(SI2C->Instance);
  212.         do{
  213.             I2C_ByteMode_Handle(SI2C);
  214.         }while(SI2C->State.MBit.Done == 0);

  215.         if((SI2C->State.W & (I2C_State_BusError | \
  216.                                    I2C_State_ArbitrationLost | \
  217.                                    I2C_State_NACK)) == 0)
  218.             return DRV_Success;

  219.         I2C_Delay(1);
  220.         
  221.     }while(-- Trials > 0);

  222.     return DRV_Failure;
  223. }

  224. void I2C_ByteMode_Handle(I2C_HandleTypeDef *SI2C)
  225. {
  226.     uint8_t lState;

  227.     if(__I2C_GetStateFlag(SI2C->Instance) == 0)
  228.         return;

  229.     lState = __I2C_GetStatusCode(SI2C->Instance);
  230.     switch(lState){
  231.         case 0x00:  // Bus Error
  232.             SI2C->State.W |= I2C_State_BusError | \
  233.                                    I2C_State_Done;;
  234.             break;

  235.         case 0x08:  // SLA+W sent and ACK received
  236.         case 0x10:  // Repeated start condition
  237.             Set_STA_STO_AA_000(SI2C->Instance);
  238.             __I2C_SendSBUF(SI2C->Instance, ((uint8_t)SI2C->SlaveAddress));
  239.             break;

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

  255.         case 0x20:  // MT SLA+W sent NACK received
  256.         case 0x30:  // MT DATA sent NACK received
  257.         case 0x48:  // MR SLA+R sent NACK received
  258.             Set_STA_STO_AA_010(SI2C->Instance);
  259.             __I2C_ClearStateFlag(SI2C->Instance);
  260.             while(__I2C_GetStatusCode(SI2C->Instance) == lState);
  261.             lState = __I2C_GetStatusCode(SI2C->Instance);
  262.             SI2C->State.W |= I2C_State_NACK | \
  263.                                    I2C_State_Done;
  264.             return;

  265.         case 0x38:  // Arbitration lost
  266.             Set_STA_STO_AA_000(SI2C->Instance);
  267.             SI2C->State.W |= I2C_State_ArbitrationLost | \
  268.                                    I2C_State_Done;
  269.             break;

  270.         case 0x40:  // SLA+R sent and ACK received
  271.             Set_STA_STO_AA_001(SI2C->Instance);
  272.         case 0x50:  // Data Received and ACK sent
  273.             if(SI2C->Count <= 1)
  274.                 Set_STA_STO_AA_000(SI2C->Instance);
  275.             *SI2C->pData = __I2C_ReceiveSBUF(SI2C->Instance);
  276.             SI2C->Count--;
  277.             SI2C->pData++;
  278.             break;

  279.         case 0x58:  // Data Received and NACK sent
  280.             if((SI2C->Control.W & I2C_XferNext_Mask) == I2C_XferNext_RepeatStart)
  281.                 Set_STA_STO_AA_100(SI2C->Instance);
  282.             else
  283.                 Set_STA_STO_AA_010(SI2C->Instance);

  284.             SI2C->State.W |= I2C_State_Done;
  285.             break;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  306.         case 0xD0:
  307.         case 0xD8:
  308.         case 0xE0:
  309.         case 0xE8:
  310.         case 0xF0:
  311.                     
  312.         case 0xF8:  // Bus Idle

  313.         default:
  314.             break;
  315.     }
  316.     __I2C_ClearStateFlag(SI2C->Instance);
  317.     while(__I2C_GetStateFlag(SI2C->Instance) != 0);
  318. }

  319. DRV_Return I2C_ByteMode_SlaveTransmit(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
  320. {
  321. //-----Check----------------------------
  322.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  323.         return DRV_Busy;

  324. //-----Set_Config-----------------------
  325.     SI2C->State.W = 0;
  326.     SI2C->SlaveAddress = DevAddress & 0xFFFE;
  327.     SI2C->pData = pData;
  328.     SI2C->Count = Lenth;
  329.     SI2C->Control.W = I2C_XferNext_STOP;

  330. //-----Start----------------------------
  331.     Set_STA_STO_AA_100(SI2C->Instance);
  332.     do{
  333.         I2C_ByteMode_Handle(SI2C);
  334.     }while(SI2C->State.MBit.Done == 0);

  335.     if((SI2C->State.W & (I2C_State_BusError | \
  336.                                I2C_State_ArbitrationLost | \
  337.                                I2C_State_NACK)) != 0)
  338.         return DRV_Failure;

  339.     return DRV_Success;
  340. }

  341. DRV_Return I2C_ByteMode_SlaveReceive(I2C_HandleTypeDef *SI2C, uint16_t DevAddress, uint8_t *pData, uint16_t Lenth)
  342. {
  343. //-----Check----------------------------
  344.     if(__I2C_GetFlagStatus(SI2C->Instance, I2C_FLAG_BUSYF) != CLR)
  345.         return DRV_Busy;

  346. //-----Set_Config-----------------------
  347.     SI2C->State.W = 0;
  348.     SI2C->SlaveAddress = DevAddress | 0x0001;
  349.     SI2C->pData = pData;
  350.     SI2C->Count = Lenth;
  351.     SI2C->Control.W = I2C_XferNext_STOP;

  352. //-----Start----------------------------
  353.     Set_STA_STO_AA_100(SI2C->Instance);
  354.     do{
  355.         I2C_ByteMode_Handle(SI2C);
  356.     }while(SI2C->State.MBit.Done == 0);

  357.     if((SI2C->State.W & (I2C_State_BusError | \
  358.                                I2C_State_ArbitrationLost | \
  359.                                I2C_State_NACK)) != 0)
  360.         return DRV_Failure;

  361.     return DRV_Success;
  362.                
  363. }

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

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

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

  449.     //=====Enable URT=====//
  450.     URT_Cmd(URTX, ENABLE);
  451.                
  452.         //==See MG32x02z_URT0_IRQ.c when interrupt in
  453. }

  454. int fputc(int ch,FILE *f)
  455. {
  456.        
  457.         URT_SetTXData(URTX,1,ch);
  458.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  459.         URT_ClearITFlag(URTX,URT_IT_TC);
  460.        
  461.         return ch;
  462. }

  463. void UartSendByte(int ch)
  464. {
  465.        
  466.         URT_SetTXData(URTX,1,ch);
  467.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  468.         URT_ClearITFlag(URTX,URT_IT_TC);
  469.        
  470. }

  471. void DMA_Init(void)
  472. {
  473.          DMA_BaseInitTypeDef DMATestPattern;

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

  514. void I2C0_IRQHandler(void)
  515. {
  516.            
  517.         char RxData=0;
  518.     if(I2C_GetFlagStatus(I2C0, I2C_FLAG_EVENTF))
  519.     {
  520.         // I2C status event interrupt.
  521.         // to do..
  522.         switch(I2C_GetEventCode(I2C0)){
  523.             case 0x00:  // Bus error during MASTER or selected slave modes, due to an illegal START or STOP condition. State 0x00 can also occur when interference causes the I2C block to enter an undefined state.
  524.                     // to do..
  525.                

  526.             case 0x08:  // A START condition has been transmitted.
  527.                     // to do..
  528.                

  529.             case 0x10:  // A repeated START condition has been transmitted.
  530.                     // to do..
  531.             

  532.             case 0x18:  // SLA+W has been transmitted; ACK has been received.
  533.                     // to do..
  534.                

  535.             case 0x20:  // SLA+W has been transmitted; NOT ACK has been received.
  536.                     // to do..
  537.               

  538.             case 0x28:  // Data byte in DAT has been transmitted; ACK has been received.
  539.                     // to do..
  540.                

  541.             case 0x30:  // Data byte in DAT has been transmitted; NOT ACK has been received.
  542.                     // to do..
  543.                

  544.             case 0x38:  // Arbitration lost in SLA+R/W or Data bytes.
  545.                     // to do..
  546.                

  547.             case 0x40:  // SLA+R has been transmitted; ACK has been received.
  548.                     // to do..
  549.               

  550.             case 0x48:  // SLA+R has been transmitted; NOT ACK has been received.
  551.                     // to do..
  552.                

  553.             case 0x50:  // Data byte has been received; ACK has been returned.
  554.                     // to do..
  555.                

  556.             case 0x58:  // Data byte has been received; NOT ACK has been returned.
  557.               break;      // to do..
  558.               

  559.             case 0x60:  // Own SLA+W has been received; ACK has been returned.
  560.                     // to do..
  561.                

  562.             case 0x68:  // Arbitration lost in SLA+R/W as master; Own SLA+W has been received, ACK returned.
  563.                 break;    // to do..
  564.                

  565.             case 0x70:  // General Call address (0x00) has been received; ACK has been returned.
  566.                     // to do..
  567.                

  568.             case 0x78:  // Arbitration lost in SLA+R/W as master; General Call address has been received, ACK has been returned.
  569.                break;     // to do..
  570.                

  571.             case 0x80:  // Previously addressed with own SLA address; DATA has been received; ACK has been returned.
  572.                     // to do..
  573.                

  574.             case 0x88:  // Previously addressed with own SLA; DATA byte has been received; NOT ACK has been returned.
  575.            
  576.                                                 RxData=I2C_ReceiveSBUF(I2C0);
  577.                                                 printf("%c\n",RxData); // to do..
  578.                 break;

  579.             case 0x90:  // Previously addressed with General Call; DATA byte has been received; ACK has been returned.
  580.                     // to do..
  581.                

  582.             case 0x98:  // Previously addressed with General Call; DATA byte has been received; NOT ACK has been returned.
  583.                     // to do..
  584.                

  585.             case 0xA0:  // A STOP condition or condition has been received while still addressed as Slave Receiver or Slave Transmitter.
  586.                 break;    // to do..
  587.                

  588.             case 0xA8:  // Own SLA+R has been received; ACK has been returned.
  589.                  
  590.                                                 I2C_SendSBUF(I2C0,0x66); // to do..
  591.                

  592.             case 0xB0:  // Arbitration lost in SLA+R/W as master; Own SLA+R has been received, ACK has been returned.
  593.                     // to do..
  594.                

  595.             case 0xB8:  // Data byte in DAT has been transmitted; ACK has been received.
  596.                     // to do..
  597.               

  598.             case 0xC0:  // Data byte in DAT has been transmitted; NOT ACK has been received.
  599.                     // to do..
  600.                

  601.             case 0xC8:  // Last data byte in DAT has been transmitted (AA = 0); ACK has been received.
  602.                 break;    // to do..
  603.             

  604.             case 0xF8:  // No relevant state information available; Bus is released ; EVENTF = 0 and no interrupt asserted.(Default)
  605.                     // to do..
  606.                 break;
  607.         }
  608.         // to do..
  609.         I2C_ClearFlag(I2C0, I2C_FLAG_EVENTF);
  610.     }
  611.        
  612. }



  613. int main()
  614. {
  615.         u32 i;
  616.        
  617.         PIN_InitTypeDef PINX_InitStruct;
  618.         CSC_Init();
  619.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;          // Pin select digital input mode
  620.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;  // Enable pull up resistor
  621.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  622.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;         // Pin output driver full strength.
  623.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
  624.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;         // Pin input data not inverse
  625.         PINX_InitStruct.PINX_Alternate_Function = 0;                                                 // Pin AFS = 0
  626.         GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                          // D6 setup at PE15
  627.         Sample_URT0_Init();
  628.         printf("hello\n");
  629.         NVIC_EnableIRQ(I2C0_IRQn);
  630.         I2C0_ByteMode_Slave_Init();
  631.        
  632.         i=0;
  633.     while(1)
  634.     {
  635.                   
  636.             i++;
  637.             if(i>=500000)
  638.             {
  639.                                 i=0;
  640.                                 PE15=~PE15;                               
  641.                         }
  642.     }

  643.                
  644. }


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

本版积分规则

26

主题

82

帖子

3

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