[DemoCode下载] M051里面提供的有操作24LC64的例子和头文件

[复制链接]
 楼主| 598330983 发表于 2018-4-30 11:55 | 显示全部楼层 |阅读模式
  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: 4 $
  5. * $Date: 14/01/28 11:43a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    This demo access EEPROM and show message on LCD panel.
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/

  11. #include <stdio.h>
  12. #include <string.h>
  13. #include "M051Series.h"
  14. #include "LCD_Driver.h"
  15. #include "EEPROM_24LC64.h"

  16. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  17. #define PLL_CLOCK           50000000


  18. uint8_t gu8Count = 0, isPress = FALSE;
  19. uint8_t g_u8Buf[256] = {0};

  20. void EINT0_IRQHandler(void)
  21. {
  22.     /* Clear P3.2 interrupt flag */
  23.     P3->ISRC = 1 << 2;
  24.     gu8Count++;
  25.     isPress = TRUE;
  26. }


  27. void SYS_Init(void)
  28. {
  29.     /*---------------------------------------------------------------------------------------------------------*/
  30.     /* Init System Clock                                                                                       */
  31.     /*---------------------------------------------------------------------------------------------------------*/

  32.     /* Enable External XTAL (4~24 MHz) */
  33.     CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_IRC10K_EN_Msk;

  34.     /* Waiting for 12MHz & IRC10kHz clock ready */
  35.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_IRC10K_STB_Msk);

  36.     /* Switch HCLK clock source to XTAL */
  37.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_HXT;

  38.     /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  39.     CLK->PLLCON |= CLK_PLLCON_PD_Msk;

  40.     /* Set PLL frequency */
  41.     CLK->PLLCON = PLLCON_SETTING;

  42.     /* Waiting for clock ready */
  43.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk);

  44.     /* Switch HCLK clock source to PLL */
  45.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_PLL;

  46.     /* Enable IP clock */
  47.     CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk | CLK_APBCLK_SPI0_EN_Msk |
  48.                   CLK_APBCLK_I2C_EN_Msk;

  49.     /* Select IP clock source */
  50.     CLK->CLKSEL1 = CLK_CLKSEL1_UART_S_HXT;

  51.     /* Update System Core Clock */
  52.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  53.     //SystemCoreClockUpdate();
  54.     PllClock        = PLL_CLOCK;            // PLL
  55.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  56.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  57.     /*---------------------------------------------------------------------------------------------------------*/
  58.     /* Init I/O Multi-function                                                                                 */
  59.     /*---------------------------------------------------------------------------------------------------------*/
  60.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  61.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  62.     SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  63.     /* Set P1.4, P1.5, P1.6, P1.7 for SPI0 to driver LCD */
  64.     SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
  65.     SYS->P1_MFP = SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;

  66.     /* Configure the SDA0 & SCL0 of I2C0 pins */
  67.     SYS->P3_MFP &= ~(SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
  68.     SYS->P3_MFP |= SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0;
  69. }


  70. void UART0_Init()
  71. {
  72.     /*---------------------------------------------------------------------------------------------------------*/
  73.     /* Init UART                                                                                               */
  74.     /*---------------------------------------------------------------------------------------------------------*/
  75.     /* Reset IP */
  76.     SYS_ResetModule(UART0_RST);

  77.     /* Configure UART0 and set UART0 Baudrate */
  78.     UART_Open(UART0, 115200);
  79. }

  80. void GPIO_Init(void)
  81. {
  82.     /* Enable debounce function of P3.2 (EINT0) */
  83.     //P3->DBEN = GPIO_DBEN_ENABLE(2);
  84.     GPIO_ENABLE_DEBOUNCE(P3, 2);

  85.     /* Set debounce time. it is about 6.4 ms */
  86.     GPIO->DBNCECON = GPIO_DBCLKSRC_LIRC | GPIO_DBCLKSEL_64;

  87.     /* Enable P3.2 to be EINT0 */
  88.     GPIO_EnableInt(P3, 2, GPIO_INT_RISING);
  89.     NVIC_EnableIRQ(EINT0_IRQn);
  90. }


  91. int32_t I2C_24LC64_AutoTest(void)
  92. {
  93.     int32_t i, i32Err;

  94.     /* Programming EEPROM */
  95.     for(i = 0; i < 256; i++)
  96.         EEPROM_Write(i, i);

  97.     /* Verify */
  98.     i32Err = 0;
  99.     for(i = 0; i < 256; i++)
  100.     {
  101.         if(EEPROM_Read(i) != i)
  102.         {
  103.             i32Err = 1;
  104.             break;
  105.         }
  106.     }

  107.     LCD_ClearScreen();
  108.     if(i32Err)
  109.     {
  110.         LCD_Print(0, "I2C EEPROM");
  111.         LCD_Print(1, "Write Fail");
  112.         return -1;
  113.     }
  114.     else
  115.     {
  116.         LCD_Print(0, "I2C EEPROM");
  117.         LCD_Print(1, "Verify OK!");
  118.     }

  119.     /* Delay for 2 seconds */
  120.     for(i = 0; i < 20; i++)
  121.         CLK_SysTickDelay(100000);

  122.     EEPROM_SequentialRead(0, g_u8Buf, 256);
  123.     /* Verify */
  124.     i32Err = 0;
  125.     for(i = 0; i < 256; i++)
  126.     {
  127.         if(g_u8Buf[i] != i)
  128.         {
  129.             i32Err = 1;
  130.             break;
  131.         }
  132.     }

  133.     LCD_ClearScreen();
  134.     if(i32Err)
  135.     {
  136.         LCD_Print(0, "I2C EEPROM");
  137.         LCD_Print(1, "Seq. Read Fail");
  138.         return -1;
  139.     }
  140.     else
  141.     {
  142.         LCD_Print(0, "I2C EEPROM");
  143.         LCD_Print(1, "Seq. Read OK!");
  144.     }

  145.     /* Delay for 2 seconds */
  146.     for(i = 0; i < 20; i++)
  147.         CLK_SysTickDelay(100000);

  148.     for(i = 0; i < 256; i++)
  149.         g_u8Buf[i] = i;
  150.     for(i = 0; i < 8; i++)
  151.         EEPROM_PageWrite(i * 32, &g_u8Buf[i * 32]);

  152.     memset(g_u8Buf, 0, 256);

  153.     EEPROM_SequentialRead(0, g_u8Buf, 256);
  154.     /* Verify */
  155.     i32Err = 0;
  156.     for(i = 0; i < 256; i++)
  157.     {
  158.         if(EEPROM_Read(i) != (i & 0xFF))
  159.         {
  160.             i32Err = 1;
  161.             break;
  162.         }
  163.     }

  164.     LCD_ClearScreen();
  165.     if(i32Err)
  166.     {
  167.         LCD_Print(0, "I2C EEPROM");
  168.         LCD_Print(1, "Page Write Fail");
  169.         return -1;
  170.     }
  171.     else
  172.     {
  173.         LCD_Print(0, "I2C EEPROM");
  174.         LCD_Print(1, "Page Write OK!");
  175.     }

  176.     return i32Err;

  177. }

  178. int32_t I2C_24LC64_ManualTest(void)
  179. {
  180.     uint32_t i2cdata = 0, temp;
  181.     char addr[16] = "Address:";
  182.     char Write[16] = "Write:";
  183.     char read[16] = "Read:";

  184.     LCD_Print(0, "I2C with 24LC64");
  185.     LCD_Print(1, "test read and  ");
  186.     LCD_Print(2, "write function ");
  187.     LCD_Print(3, "press INT button");


  188.     temp = 0x55;
  189.     while(1)
  190.     {
  191.         if(isPress)
  192.         {
  193.             isPress = FALSE;
  194.             switch(gu8Count)
  195.             {
  196.             case 1:
  197.                 LCD_ClearScreen();
  198.                 LCD_Print(0, "Key1 had pressed ");
  199.                 EEPROM_Write(0x00000000 + temp, temp + 11);
  200.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  201.                 sprintf(addr + 8, "%x", temp);
  202.                 sprintf(Write + 6, "%x", temp + 11);
  203.                 sprintf(read + 5, "%x", i2cdata);
  204.                 LCD_Print(1, addr);
  205.                 LCD_Print(2, Write);
  206.                 LCD_Print(3, read);
  207.                 break;
  208.             case 2:
  209.                 LCD_ClearScreen();
  210.                 LCD_Print(0, "Key2 had pressed ");
  211.                 EEPROM_Write(0x00000000 + temp, temp + 22);
  212.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  213.                 sprintf(addr + 8, "%x", temp);
  214.                 sprintf(Write + 6, "%x", temp + 22);
  215.                 sprintf(read + 5, "%x", i2cdata);
  216.                 LCD_Print(1, addr);
  217.                 LCD_Print(2, Write);
  218.                 LCD_Print(3, read);
  219.                 break;
  220.             case 3:
  221.                 LCD_ClearScreen();
  222.                 LCD_Print(0, "Key3 had pressed ");
  223.                 EEPROM_Write(0x00000000 + temp, temp + 33);
  224.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  225.                 sprintf(addr + 8, "%x", temp);
  226.                 sprintf(Write + 6, "%x", temp + 33);
  227.                 sprintf(read + 5, "%x", i2cdata);
  228.                 LCD_Print(1, addr);
  229.                 LCD_Print(2, Write);
  230.                 LCD_Print(3, read);
  231.                 break;
  232.             case 4:
  233.                 LCD_ClearScreen();
  234.                 LCD_Print(0, "Key4 had pressed ");
  235.                 EEPROM_Write(0x00000000 + temp, temp + 44);
  236.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  237.                 sprintf(addr + 8, "%x", temp);
  238.                 sprintf(Write + 6, "%x", temp + 44);
  239.                 sprintf(read + 5, "%x", i2cdata);
  240.                 LCD_Print(1, addr);
  241.                 LCD_Print(2, Write);
  242.                 LCD_Print(3, read);
  243.                 break;
  244.             case 5:
  245.                 LCD_ClearScreen();
  246.                 LCD_Print(0, "Key5 had pressed ");
  247.                 EEPROM_Write(0x00000000 + temp, temp + 55);
  248.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  249.                 sprintf(addr + 8, "%x", temp);
  250.                 sprintf(Write + 6, "%x", temp + 55);
  251.                 sprintf(read + 5, "%x", i2cdata);
  252.                 LCD_Print(1, addr);
  253.                 LCD_Print(2, Write);
  254.                 LCD_Print(3, read);
  255.                 break;
  256.             case 6:
  257.                 LCD_ClearScreen();
  258.                 LCD_Print(0, "Key6 had pressed ");
  259.                 EEPROM_Write(0x00000000 + temp, temp + 66);
  260.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  261.                 sprintf(addr + 8, "%x", temp);
  262.                 sprintf(Write + 6, "%x", temp + 66);
  263.                 sprintf(read + 5, "%x", i2cdata);
  264.                 LCD_Print(1, addr);
  265.                 LCD_Print(2, Write);
  266.                 LCD_Print(3, read);
  267.                 break;
  268.             case 7:
  269.                 LCD_ClearScreen();
  270.                 LCD_Print(0, "Key7 had pressed ");
  271.                 EEPROM_Write(0x00000000 + temp, temp + 77);
  272.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  273.                 sprintf(addr + 8, "%x", temp);
  274.                 sprintf(Write + 6, "%x", temp + 77);
  275.                 sprintf(read + 5, "%x", i2cdata);
  276.                 LCD_Print(1, addr);
  277.                 LCD_Print(2, Write);
  278.                 LCD_Print(3, read);
  279.                 break;
  280.             case 8:
  281.                 LCD_ClearScreen();
  282.                 LCD_Print(0, "Key8 had pressed ");
  283.                 EEPROM_Write(0x00000000 + temp, temp + 88);
  284.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  285.                 sprintf(addr + 8, "%x", temp);
  286.                 sprintf(Write + 6, "%x", temp + 88);
  287.                 sprintf(read + 5, "%x", i2cdata);
  288.                 LCD_Print(1, addr);
  289.                 LCD_Print(2, Write);
  290.                 LCD_Print(3, read);
  291.                 break;
  292.             case 9:
  293.                 LCD_ClearScreen();
  294.                 LCD_Print(0, "Key9 had pressed ");
  295.                 EEPROM_Write(0x00000000 + temp, temp + 99);
  296.                 i2cdata = EEPROM_Read(0x00000000 + temp);
  297.                 sprintf(addr + 8, "%x", temp);
  298.                 sprintf(Write + 6, "%x", temp + 99);
  299.                 sprintf(read + 5, "%x", i2cdata);
  300.                 LCD_Print(1, addr);
  301.                 LCD_Print(2, Write);
  302.                 LCD_Print(3, read);
  303.                 gu8Count = 0;
  304.                 break;
  305.             default:
  306.                 break;
  307.             } //End Switch
  308.         } //End if(isPress)
  309.     } //End While

  310. }

  311. int main(void)
  312. {
  313.     int32_t i;


  314.     /* Unlock protected registers */
  315.     SYS_UnlockReg();

  316.     /* Init system, IP clock and multi-function I/O */
  317.     SYS_Init();

  318.     /* Lock protected registers */
  319.     SYS_LockReg();

  320.     /* Init UART0 for printf */
  321.     UART0_Init();

  322.     /* Init GPIO P3.2 as EINT0 */
  323.     GPIO_Init();

  324.     /* Init SPI0 and LCD */
  325.     LCD_Init();
  326.     LCD_EnableBackLight();
  327.     LCD_ClearScreen();


  328.     /*
  329.        This sample code should work with EEPROM 24LC64
  330.        to show how to program EEPROM through I2C interface.

  331.        The demo will program EEPROM and verify the written data.
  332.        Finally, user may press "SW_INT" key to write and read a byte.
  333.        And the byte will shown on LCD display
  334.     */

  335.     EEPROM_Init();

  336.     /* Test EEPROM read/write automatically */
  337.     I2C_24LC64_AutoTest();

  338.     /* Delay for 2 seconds */
  339.     for(i = 0; i < 20; i++)
  340.         CLK_SysTickDelay(100000);

  341.     /* Test EEPROM read/write by key pressing */
  342.     I2C_24LC64_ManualTest();

  343. }


 楼主| 598330983 发表于 2018-4-30 11:56 | 显示全部楼层
以后再用这个IIC芯片,就不用自己写代码了。
LM莫 发表于 2018-4-30 14:46 | 显示全部楼层
我记得新唐的例程里面都有驱动24xx系列芯片的驱动的。
 楼主| 598330983 发表于 2018-4-30 14:54 | 显示全部楼层
LM莫 发表于 2018-4-30 14:46
我记得新唐的例程里面都有驱动24xx系列芯片的驱动的。

是的,有的,这个上面的头文件,就是那个驱动
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

5573

帖子

22

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

266

主题

5573

帖子

22

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