[DemoCode下载] M051的I2C唤醒演示

[复制链接]
2396|11
 楼主| 643757107 发表于 2018-2-27 18:34 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 5 $
  5. * $Date: 15/05/22 2:41p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series I2C Driver Sample Code for Wake-up (Master)
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "M051Series.h"

  14. #define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
  15. #define PLL_CLOCK           50000000

  16. /*---------------------------------------------------------------------------------------------------------*/
  17. /* Global variables                                                                                        */
  18. /*---------------------------------------------------------------------------------------------------------*/
  19. volatile uint8_t g_u8DeviceAddr;
  20. volatile uint8_t g_au8MstTxData[3];
  21. volatile uint8_t g_u8MstRxData;
  22. volatile uint8_t g_u8MstDataLen;
  23. volatile uint8_t g_u8MstEndFlag = 0;

  24. typedef void (*I2C_FUNC)(uint32_t u32Status);

  25. static volatile I2C_FUNC s_I2C0HandlerFn = NULL;

  26. /*---------------------------------------------------------------------------------------------------------*/
  27. /*  I2C0 IRQ Handler                                                                                       */
  28. /*---------------------------------------------------------------------------------------------------------*/
  29. void I2C0_IRQHandler(void)
  30. {
  31.     uint32_t u32Status;

  32.     u32Status = I2C_GET_STATUS(I2C0);

  33.     if(I2C_GET_TIMEOUT_FLAG(I2C0))
  34.     {
  35.         /* Clear I2C0 Timeout Flag */
  36.         I2C_ClearTimeoutFlag(I2C0);
  37.     }
  38.     else
  39.     {
  40.         if(s_I2C0HandlerFn != NULL)
  41.             s_I2C0HandlerFn(u32Status);
  42.     }
  43. }

  44. /*---------------------------------------------------------------------------------------------------------*/
  45. /*  I2C Master Tx Wake Up Callback Function                                                                        */
  46. /*---------------------------------------------------------------------------------------------------------*/
  47. void I2C_MasterTxWakeup(uint32_t u32Status)
  48. {
  49.     if(u32Status == 0x08)                       /* START has been transmitted */
  50.     {
  51.         I2C_SET_DATA(I2C0, (g_u8DeviceAddr << 1));    /* Write SLA+W to Register I2CDAT */
  52.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  53.     }
  54.     else if(u32Status == 0x18)                  /* SLA+W has been transmitted and ACK has been received */
  55.     {
  56.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI);
  57.         g_u8MstEndFlag = 1;
  58.     }
  59.     else if(u32Status == 0x20)                  /* SLA+W has been transmitted and NOT ACK has been received */
  60.     {
  61.         I2C_STOP(I2C0);
  62.         g_u8MstEndFlag = 1;
  63.     }
  64.     else
  65.     {
  66.         /* TO DO */
  67.         printf("Status 0x%x is NOT processed\n", u32Status);
  68.     }
  69. }
  70. /*---------------------------------------------------------------------------------------------------------*/
  71. /*  I2C Rx Callback Function                                                                               */
  72. /*---------------------------------------------------------------------------------------------------------*/
  73. void I2C_MasterRx(uint32_t u32Status)
  74. {
  75.     if(u32Status == 0x08)                       /* START has been transmitted and prepare SLA+W */
  76.     {
  77.         I2C_SET_DATA(I2C0, (g_u8DeviceAddr << 1));    /* Write SLA+W to Register I2CDAT */
  78.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  79.     }
  80.     else if(u32Status == 0x18)                  /* SLA+W has been transmitted and ACK has been received */
  81.     {
  82.         I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  83.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  84.     }
  85.     else if(u32Status == 0x20)                  /* SLA+W has been transmitted and NACK has been received */
  86.     {
  87.         I2C_STOP(I2C0);
  88.         I2C_START(I2C0);
  89.     }
  90.     else if(u32Status == 0x28)                  /* DATA has been transmitted and ACK has been received */
  91.     {
  92.         if(g_u8MstDataLen != 2)
  93.         {
  94.             I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  95.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  96.         }
  97.         else
  98.         {
  99.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA_SI);
  100.         }
  101.     }
  102.     else if(u32Status == 0x10)                  /* Repeat START has been transmitted and prepare SLA+R */
  103.     {
  104.         I2C_SET_DATA(I2C0, ((g_u8DeviceAddr << 1) | 0x01)); /* Write SLA+R to Register I2CDAT */
  105.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  106.     }
  107.     else if(u32Status == 0x40)                  /* SLA+R has been transmitted and ACK has been received */
  108.     {
  109.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  110.     }
  111.     else if(u32Status == 0x58)                  /* DATA has been received and NACK has been returned */
  112.     {
  113.         g_u8MstRxData = (unsigned char) I2C_GET_DATA(I2C0);
  114.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI);
  115.         g_u8MstEndFlag = 1;
  116.     }
  117.     else
  118.     {
  119.         /* TO DO */
  120.         printf("Status 0x%x is NOT processed\n", u32Status);
  121.     }
  122. }

  123. /*---------------------------------------------------------------------------------------------------------*/
  124. /*  I2C Tx Callback Function                                                                               */
  125. /*---------------------------------------------------------------------------------------------------------*/
  126. void I2C_MasterTx(uint32_t u32Status)
  127. {
  128.     if(u32Status == 0x08)                       /* START has been transmitted */
  129.     {
  130.         I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1);    /* Write SLA+W to Register I2CDAT */
  131.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  132.     }
  133.     else if(u32Status == 0x18)                  /* SLA+W has been transmitted and ACK has been received */
  134.     {
  135.         I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  136.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  137.     }
  138.     else if(u32Status == 0x20)                  /* SLA+W has been transmitted and NACK has been received */
  139.     {
  140.         I2C_STOP(I2C0);
  141.         I2C_START(I2C0);
  142.     }
  143.     else if(u32Status == 0x28)                  /* DATA has been transmitted and ACK has been received */
  144.     {
  145.         if(g_u8MstDataLen != 3)
  146.         {
  147.             I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  148.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  149.         }
  150.         else
  151.         {
  152.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI);
  153.             g_u8MstEndFlag = 1;
  154.         }
  155.     }
  156.     else
  157.     {
  158.         /* TO DO */
  159.         printf("Status 0x%x is NOT processed\n", u32Status);
  160.     }
  161. }

  162. void SYS_Init(void)
  163. {
  164.     /*---------------------------------------------------------------------------------------------------------*/
  165.     /* Init System Clock                                                                                       */
  166.     /*---------------------------------------------------------------------------------------------------------*/

  167.     /* Enable Internal RC 22.1184MHz clock */
  168.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  169.     /* Waiting for Internal RC clock ready */
  170.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  171.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  172.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  173.     /* Enable external XTAL 12MHz clock */
  174.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  175.     /* Waiting for external XTAL clock ready */
  176.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  177.     /* Set core clock as PLL_CLOCK from PLL */
  178.     CLK_SetCoreClock(PLL_CLOCK);

  179.     /* Enable UART & I2C0 module clock */
  180.     CLK_EnableModuleClock(UART0_MODULE);
  181.     CLK_EnableModuleClock(I2C0_MODULE);

  182.     /* Select UART module clock source */
  183.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  184.     /*---------------------------------------------------------------------------------------------------------*/
  185.     /* Init I/O Multi-function                                                                                 */
  186.     /*---------------------------------------------------------------------------------------------------------*/

  187.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  188.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  189.     SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  190.     /* Configure the SDA0 & SCL0 of I2C0 pins */
  191.     SYS->P3_MFP &= ~(SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
  192.     SYS->P3_MFP |= SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0;
  193. }

  194. void UART0_Init()
  195. {
  196.     /*---------------------------------------------------------------------------------------------------------*/
  197.     /* Init UART                                                                                               */
  198.     /*---------------------------------------------------------------------------------------------------------*/
  199.     /* Reset IP */
  200.     SYS_ResetModule(UART0_RST);

  201.     /* Configure UART0 and set UART0 Baudrate */
  202.     UART_Open(UART0, 115200);
  203. }

  204. void I2C0_Init(void)
  205. {
  206.     /* Open I2C module and set bus clock */
  207.     I2C_Open(I2C0, 100000);

  208.     /* Get I2C0 Bus Clock */
  209.     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C0));

  210.     /* Set I2C 4 Slave Addresses */
  211.     I2C_SetSlaveAddr(I2C0, 0, 0x15, 0);   /* Slave Address : 0x15 */
  212.     I2C_SetSlaveAddr(I2C0, 1, 0x35, 0);   /* Slave Address : 0x35 */
  213.     I2C_SetSlaveAddr(I2C0, 2, 0x55, 0);   /* Slave Address : 0x55 */
  214.     I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */

  215.     /* Enable I2C interrupt */
  216.     I2C_EnableInt(I2C0);
  217.     NVIC_EnableIRQ(I2C0_IRQn);
  218. }

  219. void I2C0_Close(void)
  220. {
  221.     /* Disable I2C0 interrupt and clear corresponding NVIC bit */
  222.     I2C_DisableInt(I2C0);
  223.     NVIC_DisableIRQ(I2C0_IRQn);

  224.     /* Disable I2C0 and close I2C0 clock */
  225.     I2C_Close(I2C0);
  226.     CLK_DisableModuleClock(I2C0_MODULE);

  227. }

  228. int32_t I2C0_Read_Write_SLAVE(uint8_t slvaddr)
  229. {
  230.     uint32_t i;

  231.     g_u8DeviceAddr = slvaddr;

  232.     for(i = 0; i < 0x100; i++)
  233.     {
  234.         g_au8MstTxData[0] = (uint8_t)((i & 0xFF00) >> 8);
  235.         g_au8MstTxData[1] = (uint8_t)(i & 0x00FF);
  236.         g_au8MstTxData[2] = (uint8_t)(g_au8MstTxData[1] + 3);

  237.         g_u8MstDataLen = 0;
  238.         g_u8MstEndFlag = 0;

  239.         /* I2C function to write data to slave */
  240.         s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  241.         /* I2C as master sends START signal */
  242.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  243.         /* Wait I2C Tx Finish */
  244.         while(g_u8MstEndFlag == 0);
  245.         g_u8MstEndFlag = 0;

  246.         /* I2C function to read data from slave */
  247.         s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterRx;

  248.         g_u8MstDataLen = 0;
  249.         g_u8DeviceAddr = slvaddr;

  250.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  251.         /* Wait I2C Rx Finish */
  252.         while(g_u8MstEndFlag == 0);

  253.         /* Compare data */
  254.         if(g_u8MstRxData != g_au8MstTxData[2])
  255.         {
  256.             printf("I2C Byte Write/Read Failed, Data 0x%x\n", g_u8MstRxData);
  257.             return -1;
  258.         }
  259.     }
  260.     printf("Master Access Slave (0x%X) Test OK\n", slvaddr);
  261.     return 0;
  262. }

  263. /*---------------------------------------------------------------------------------------------------------*/
  264. /*  Main Function                                                                                          */
  265. /*---------------------------------------------------------------------------------------------------------*/
  266. int32_t main(void)
  267. {
  268.     /* Unlock protected registers */
  269.     SYS_UnlockReg();

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

  272.     /* Init UART0 for printf */
  273.     UART0_Init();

  274.     /* Lock protected registers */
  275.     SYS_LockReg();

  276.     /*
  277.         This sample code sets I2C bus clock to 100kHz. After wake-up, then accesses Slave with Byte
  278.         Write and Byte Read operations, and check if the read data is equal to the programmed data.
  279.     */

  280.     printf("+-----------------------------------------------------------------------+\n");
  281.     printf("| M05xx I2C Driver Sample Code (Master) for wake-up & access Slave test |\n");
  282.     printf("|                                                                       |\n");
  283.     printf("| I2C Master (I2C0) <---> I2C Slave(I2C0)                               |\n");
  284.     printf("+-----------------------------------------------------------------------+\n");

  285.     printf("Configure I2C0 as a master.\n");
  286.     printf("The I/O connection for I2C0:\n");
  287.     printf("I2C0_SDA(P3.4), I2C0_SCL(P3.5)\n");

  288.     /* Init I2C0 to access Slave */
  289.     I2C0_Init();

  290.     printf("\n");
  291.     printf("Check I2C slave at power down status.\n");
  292.     printf("Press any key to Wake up slave.\n");
  293.     getchar();

  294.     /* Set the Slave address to wake-up*/
  295.     g_u8DeviceAddr = 0x15;

  296.     /* I2C function to wake-up slave*/
  297.     s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTxWakeup;

  298.     /* Send a START condition to bus */
  299.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);
  300.     while(g_u8MstEndFlag == 0);

  301.     /*Access to the corresponding address Slave*/
  302.     printf("\n");
  303.     printf(" == No Mask Address ==\n");
  304.     I2C0_Read_Write_SLAVE(0x15);
  305.     I2C0_Read_Write_SLAVE(0x35);
  306.     I2C0_Read_Write_SLAVE(0x55);
  307.     I2C0_Read_Write_SLAVE(0x75);
  308.     printf("SLAVE Address test OK.\n");


  309.     /* Access Slave with address mask */
  310.     printf("\n");
  311.     printf(" == Mask Address ==\n");
  312.     I2C0_Read_Write_SLAVE(0x15 & ~0x01);
  313.     I2C0_Read_Write_SLAVE(0x35 & ~0x04);
  314.     I2C0_Read_Write_SLAVE(0x55 & ~0x01);
  315.     I2C0_Read_Write_SLAVE(0x75 & ~0x04);
  316.     printf("SLAVE Address Mask test OK.\n");

  317.     s_I2C0HandlerFn = NULL;

  318.     /* Close I2C0 */
  319.     I2C0_Close();

  320.     while(1);
  321. }


 楼主| 643757107 发表于 2018-2-27 18:35 | 显示全部楼层
  1. /**************************************************************************//**
  2. * @file     main.c
  3. * @version  V3.00
  4. * $Revision: 5 $
  5. * $Date: 14/11/14 11:19a $
  6. * @brief    M051 Series I2C Driver Sample Code for Wake-up (Slave)
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "M051Series.h"

  14. #define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
  15. #define PLL_CLOCK           50000000

  16. uint32_t slave_buff_addr;
  17. uint8_t g_au8SlvData[256];
  18. uint8_t g_au8SlvRxData[3];
  19. uint8_t g_u8SlvPWRDNWK, g_u8SlvI2CWK;
  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Global variables                                                                                        */
  22. /*---------------------------------------------------------------------------------------------------------*/
  23. volatile uint8_t g_u8DeviceAddr;
  24. volatile uint8_t g_u8SlvDataLen;

  25. typedef void (*I2C_FUNC)(uint32_t u32Status);

  26. static I2C_FUNC s_I2C0HandlerFn = NULL;

  27. /*---------------------------------------------------------------------------------------------------------*/
  28. /*  I2C0 IRQ Handler                                                                                       */
  29. /*---------------------------------------------------------------------------------------------------------*/
  30. void I2C0_IRQHandler(void)
  31. {
  32.     uint32_t u32Status;

  33.     /* Check I2C Wake-up interrupt flag set or not */
  34.     if(I2C_GET_WAKEUP_FLAG(I2C0))
  35.     {
  36.         /* Clear I2C Wake-up interrupt flag */
  37.         I2C_CLEAR_WAKEUP_FLAG(I2C0);
  38.                        
  39.         g_u8SlvI2CWK = 1;               
  40.                        
  41.         return;
  42.     }

  43.     u32Status = I2C_GET_STATUS(I2C0);

  44.     if(I2C_GET_TIMEOUT_FLAG(I2C0))
  45.     {
  46.         /* Clear I2C0 Timeout Flag */
  47.         I2C_ClearTimeoutFlag(I2C0);
  48.     }
  49.     else
  50.     {
  51.         if(s_I2C0HandlerFn != NULL)
  52.             s_I2C0HandlerFn(u32Status);
  53.     }
  54. }
  55. /*---------------------------------------------------------------------------------------------------------*/
  56. /*  Power Wake-up IRQ Handler                                                                                       */
  57. /*---------------------------------------------------------------------------------------------------------*/
  58. void PWRWU_IRQHandler(void)
  59. {
  60.     /* Check system power down mode wake-up interrupt flag */
  61.     if(((CLK->PWRCON) & CLK_PWRCON_PD_WU_STS_Msk) != 0)
  62.     {
  63.         /* Clear system power down wake-up interrupt flag */
  64.         CLK->PWRCON |= CLK_PWRCON_PD_WU_STS_Msk;

  65.                           g_u8SlvPWRDNWK = 1;
  66.     }
  67. }

  68. /*---------------------------------------------------------------------------------------------------------*/
  69. /*  I2C Slave Transmit/Receive Callback Function                                                                               */
  70. /*---------------------------------------------------------------------------------------------------------*/
  71. void I2C_SlaveTRx(uint32_t u32Status)
  72. {
  73.     if(u32Status == 0x60)                       /* Own SLA+W has been receive; ACK has been return */
  74.     {
  75.         g_u8SlvDataLen = 0;
  76.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  77.     }
  78.     else if(u32Status == 0x80)                 /* Previously address with own SLA address
  79.                                                    Data has been received; ACK has been returned*/
  80.     {
  81.         g_au8SlvRxData[g_u8SlvDataLen] = (unsigned char)I2C_GET_DATA(I2C0);
  82.         g_u8SlvDataLen++;

  83.         if(g_u8SlvDataLen == 2)
  84.         {
  85.             slave_buff_addr = (g_au8SlvRxData[0] << 8) + g_au8SlvRxData[1];
  86.         }
  87.         if(g_u8SlvDataLen == 3)
  88.         {
  89.             g_au8SlvData[slave_buff_addr] = g_au8SlvRxData[2];
  90.             g_u8SlvDataLen = 0;
  91.         }
  92.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  93.     }
  94.     else if(u32Status == 0xA8)                  /* Own SLA+R has been receive; ACK has been return */
  95.     {
  96.         I2C_SET_DATA(I2C0, g_au8SlvData[slave_buff_addr]);
  97.         slave_buff_addr++;
  98.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  99.     }
  100.     else if(u32Status == 0xC0)                 /* Data byte or last data in I2CDAT has been transmitted
  101.                                                    Not ACK has been received */
  102.     {
  103.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  104.     }
  105.     else if(u32Status == 0x88)                 /* Previously addressed with own SLA address; NOT ACK has
  106.                                                    been returned */
  107.     {
  108.         g_u8SlvDataLen = 0;
  109.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  110.     }
  111.     else if(u32Status == 0xA0)                 /* A STOP or repeated START has been received while still
  112.                                                    addressed as Slave/Receiver*/
  113.     {
  114.         g_u8SlvDataLen = 0;
  115.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);
  116.     }
  117.     else
  118.     {
  119.         /* TO DO */
  120.         printf("Status 0x%x is NOT processed\n", u32Status);
  121.     }
  122. }

  123. void SYS_Init(void)
  124. {
  125.     /*---------------------------------------------------------------------------------------------------------*/
  126.     /* Init System Clock                                                                                       */
  127.     /*---------------------------------------------------------------------------------------------------------*/

  128.     /* Enable Internal RC 22.1184MHz clock */
  129.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  130.     /* Waiting for Internal RC clock ready */
  131.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  132.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  133.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  134.     /* Enable external XTAL 12MHz clock */
  135.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  136.     /* Waiting for external XTAL clock ready */
  137.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  138.     /* Set core clock as PLL_CLOCK from PLL */
  139.     CLK_SetCoreClock(PLL_CLOCK);

  140.     /* Enable UART & I2C0 module clock */
  141.     CLK_EnableModuleClock(UART0_MODULE);
  142.     CLK_EnableModuleClock(I2C0_MODULE);

  143.     /* Select UART module clock source */
  144.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  145.     /*---------------------------------------------------------------------------------------------------------*/
  146.     /* Init I/O Multi-function                                                                                 */
  147.     /*---------------------------------------------------------------------------------------------------------*/

  148.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  149.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  150.     SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  151.     /* Configure the SDA0 & SCL0 of I2C0 pins */
  152.     SYS->P3_MFP &= ~(SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
  153.     SYS->P3_MFP |= SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0;
  154. }

  155. void UART0_Init()
  156. {
  157.     /*---------------------------------------------------------------------------------------------------------*/
  158.     /* Init UART                                                                                               */
  159.     /*---------------------------------------------------------------------------------------------------------*/
  160.     /* Reset IP */
  161.     SYS_ResetModule(UART0_RST);

  162.     /* Configure UART0 and set UART0 Baudrate */
  163.     UART_Open(UART0, 115200);
  164. }

  165. void I2C0_Init(void)
  166. {
  167.     /* Open I2C module and set bus clock */
  168.     I2C_Open(I2C0, 100000);

  169.     /* Get I2C0 Bus Clock */
  170.     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C0));

  171.     /* Set I2C 4 Slave Addresses */
  172.     I2C_SetSlaveAddr(I2C0, 0, 0x15, 0);   /* Slave Address : 0x15 */
  173.     I2C_SetSlaveAddr(I2C0, 1, 0x35, 0);   /* Slave Address : 0x35 */
  174.     I2C_SetSlaveAddr(I2C0, 2, 0x55, 0);   /* Slave Address : 0x55 */
  175.     I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */

  176.     /* Set I2C 4 Slave Addresses Mask */
  177.     I2C_SetSlaveAddrMask(I2C0, 0, 0x01);
  178.     I2C_SetSlaveAddrMask(I2C0, 1, 0x04);
  179.     I2C_SetSlaveAddrMask(I2C0, 2, 0x01);
  180.     I2C_SetSlaveAddrMask(I2C0, 3, 0x04);

  181.     /* Enable I2C interrupt */
  182.     I2C_EnableInt(I2C0);
  183.     NVIC_EnableIRQ(I2C0_IRQn);
  184. }

  185. void I2C0_Close(void)
  186. {
  187.     /* Disable I2C0 interrupt and clear corresponding NVIC bit */
  188.     I2C_DisableInt(I2C0);
  189.     NVIC_DisableIRQ(I2C0_IRQn);

  190.     /* Disable I2C0 and close I2C0 clock */
  191.     I2C_Close(I2C0);
  192.     CLK_DisableModuleClock(I2C0_MODULE);
  193. }

  194. /*---------------------------------------------------------------------------------------------------------*/
  195. /*  Main Function                                                                                          */
  196. /*---------------------------------------------------------------------------------------------------------*/
  197. int32_t main(void)
  198. {
  199.     uint32_t i;

  200.     /* Unlock protected registers */
  201.     SYS_UnlockReg();

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

  204.     /* Init UART0 for printf */
  205.     UART0_Init();

  206.     /* Lock protected registers */
  207.     SYS_LockReg();;

  208.     /*
  209.         This sample code is I2C SLAVE mode and it simulates EEPROM function
  210.     */
  211.     printf("\n");
  212.     printf("+----------------------------------------------------------------------+\n");
  213.     printf("| M05xx I2C Driver Sample Code (Slave) for wake-up & access Slave test |\n");
  214.     printf("|                                                                      |\n");
  215.     printf("| I2C Master (I2C0) <---> I2C Slave(I2C0)                              |\n");
  216.     printf("+----------------------------------------------------------------------+\n");

  217.     printf("Configure I2C0 as a slave.\n");
  218.     printf("The I/O connection for I2C0:\n");
  219.     printf("I2C0_SDA(P3.4), I2C0_SCL(P3.5)\n");

  220.     /* Init I2C0 */
  221.     I2C0_Init();

  222.     for(i = 0; i < 0x100; i++)
  223.     {
  224.         g_au8SlvData[i] = 0;
  225.     }

  226.     /* I2C function to Transmit/Receive data as slave */
  227.     s_I2C0HandlerFn = I2C_SlaveTRx;
  228.                
  229.     /* Set I2C0 enter Not Address SLAVE mode */
  230.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI_AA);

  231.     /* Unlock protected registers */
  232.     SYS_UnlockReg();

  233.     /* Enable power wake-up interrupt */
  234.     CLK->PWRCON |= CLK_PWRCON_PD_WU_INT_EN_Msk;
  235.     NVIC_EnableIRQ(PWRWU_IRQn);

  236.     /* Enable I2C wake-up */
  237.     I2C0-> I2CWKUPCON |= I2C_I2CWKUPCON_WKUPEN_Msk;

  238.     /* Enable Chip enter power down mode */
  239.     CLK->PWRCON |= CLK_PWRCON_PD_WAIT_CPU_Msk;

  240.     /* Processor use deep sleep */
  241.     SCB->SCR = SCB_SCR_SLEEPDEEP_Msk;

  242.     /* System power down enable */
  243.     CLK->PWRCON |= CLK_PWRCON_PWR_DOWN_EN_Msk;

  244.     printf("\n");
  245.     printf("Enter PD 0x%x 0x%x\n", I2C0->I2CON , I2C0->I2CSTATUS);
  246.     printf("\n");
  247.     printf("CHIP enter power down status.\n");
  248.     /* Waiting for UART printf finish*/
  249.     while(((UART0->FSR) & UART_FSR_TE_FLAG_Msk) == 0);

  250.     if(((I2C0->I2CON)&I2C_I2CON_SI_Msk) != 0)
  251.     {
  252.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  253.     }

  254.     /*  Use WFI instruction to idle the CPU. NOTE:
  255.         If ICE is attached, system will wakeup immediately because ICE is a wakeup event. */
  256.     __WFI();
  257.     __NOP();
  258.     __NOP();
  259.     __NOP();

  260.     while((g_u8SlvPWRDNWK & g_u8SlvI2CWK) == 0);   
  261.                 printf("Power-down Wake-up INT 0x%x\n", ((CLK->PWRCON) & CLK_PWRCON_PD_WU_STS_Msk));               
  262.                 printf("I2C0 WAKE INT 0x%x\n", I2C0->I2CWKUPSTS);
  263.                
  264.     /* Disable power wake-up interrupt */
  265.     CLK->PWRCON &= ~CLK_PWRCON_PD_WU_INT_EN_Msk;
  266.     NVIC_DisableIRQ(PWRWU_IRQn);

  267.     /* Lock protected registers */
  268.     SYS_LockReg();

  269.     printf("\n");
  270.     printf("Slave wake-up from power down status.\n");

  271.     printf("\n");
  272.     printf("Slave Waiting for receiving data.\n");

  273.     while(1);
  274. }



  275. [em:21:]
 楼主| 643757107 发表于 2018-2-27 18:35 | 显示全部楼层
我看了一下例子,只有I2C有这个功能,SPI的就没有。
 楼主| 643757107 发表于 2018-2-27 18:36 | 显示全部楼层
I2C还是比SPI更强大的,虽然逻辑上比SPI更难理解,但是学会了,用处很大。
 楼主| 643757107 发表于 2018-2-27 18:36 | 显示全部楼层
用更少的线实现更高效的通信。
jiekou001 发表于 2018-2-27 19:06 | 显示全部楼层
学会这些常用的接口,比什么都重要。
xinpian101 发表于 2018-2-27 19:20 | 显示全部楼层
注释很全面啊,很容易理解。
小明的同学 发表于 2018-2-27 23:34 | 显示全部楼层
没想到这个接口这么好用
幸福小强 发表于 2018-2-28 22:07 | 显示全部楼层
有没有中文版详细讲这个硬件使用教程的。
幸福小强 发表于 2018-2-28 22:17 | 显示全部楼层
看来我要好好研究一下这个了,好多人说I2C 不好用,那就是说,用好了,很容易加薪啊
捉虫天师 发表于 2018-2-28 22:29 | 显示全部楼层
看手册啊,每个厂家的外设结构不同,用的寄存器名字也不同,当然了,你要先掌握这个协议的套路
xujunyi3611 发表于 2018-2-28 22:40 | 显示全部楼层
楼主的代码很规范呀,赞一个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3972

帖子

11

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