[DemoCode下载] GPIO模擬I2C存取EEPROM

[复制链接]
 楼主| a_ziliu 发表于 2016-12-26 10:41 | 显示全部楼层 |阅读模式
GPIO模擬I2C存取EEPROM
EC_NUC230_240_GPIO_I2C.zip (958.82 KB, 下载次数: 17)

EC_NUC230_240_GPIO_I2C.zip

958.82 KB, 下载次数: 14

643757107 发表于 2016-12-26 14:44 | 显示全部楼层
楼主是GPIO模拟高手啊
598330983 发表于 2016-12-26 17:11 | 显示全部楼层
不知道这个是什么型号的EEPROM。
稳稳の幸福 发表于 2016-12-26 22:36 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 3 $
  5. * $Date: 15/08/18 11:54a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC200 Series LED Controller Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "NUC230_240.h"
  14. #include "NuEdu-Basic01.h"
  15. #define I2C_ADDRESS_w 0xa0
  16. #define I2C_ADDRESS_r 0xa1
  17. #define I2C_DELAY_TIME  10 /* us */
  18. #define ACK   0
  19. #define NO_ACK   1
  20. #define I2C_CLK PA11
  21. #define I2C_DAT PA10
  22. void I2C_init(void) {
  23. GPIO_SetMode(PA, BIT10, GPIO_PMD_OPEN_DRAIN);//I2C_CLK
  24. GPIO_SetMode(PA, BIT11, GPIO_PMD_OPEN_DRAIN);//I2C_DAT
  25. I2C_CLK=1;
  26. I2C_DAT=1;
  27. }

  28. void I2C_start(void) {

  29. /* I2C start sequence is defined as
  30.   * a High to Low Transition on the data
  31.   * line as the CLK pin is high */
  32. I2C_DAT=1;
  33. I2C_CLK=1;
  34. CLK_SysTickDelay(I2C_DELAY_TIME);
  35. I2C_DAT=0;
  36. I2C_CLK=0;
  37. CLK_SysTickDelay(I2C_DELAY_TIME);
  38. }

  39. void I2C_stop(void) {
  40.   
  41. /* I2C stop sequence is defined as
  42.   * data pin is low, then CLK pin is high,
  43.   * finally data pin is high. */
  44.   I2C_DAT=0;
  45.         I2C_CLK=1;
  46.         I2C_DAT=1;
  47. }

  48. unsigned char I2C_write(unsigned char data) {
  49.   
  50. /* An I2C output byte is bits 7-0
  51.    * (MSB to LSB).  Shift one bit at a time
  52.   * to the MDO output, and then clock the
  53.   * data to the I2C Slave */

  54. unsigned char i,temp;

  55. /* Write to slave */
  56. for(i = 0; i < 8; i++)
  57.         {  
  58.         /* Send data bit */
  59.         if((data&0x80)==0x80)        
  60.                 I2C_DAT=1;
  61.           else
  62.                         I2C_DAT=0;
  63.   data <<= 1;   /* Shift one bit */
  64.   I2C_CLK=1; /* SCL: High */
  65.   CLK_SysTickDelay(I2C_DELAY_TIME);
  66.   I2C_CLK=0; /* SCL: Low */
  67.   CLK_SysTickDelay(I2C_DELAY_TIME);
  68. }
  69. I2C_DAT=1;

  70. I2C_CLK=1;  /* SCL: High */
  71. CLK_SysTickDelay(I2C_DELAY_TIME/2);
  72. temp=I2C_DAT; /* Read ACK bit from slave */
  73. CLK_SysTickDelay(I2C_DELAY_TIME/2);
  74. I2C_CLK=0;  /* SCL: Low */
  75. CLK_SysTickDelay(I2C_DELAY_TIME);
  76. return temp;
  77. }

  78. unsigned char I2C_read(unsigned char send_ack)
  79. {
  80.   
  81. unsigned char i, data;

  82. data = 0x00;

  83. /* Read from slave */
  84. for(i = 0; i < 8; i++) {
  85.   data <<= 1;   /* Shift one bit */
  86.   data |= I2C_DAT; /* Read data bit */
  87.   I2C_CLK=1; /* SCL: High */
  88.   CLK_SysTickDelay(I2C_DELAY_TIME);
  89.   I2C_CLK=0; /* SCL: Low */
  90.   CLK_SysTickDelay(I2C_DELAY_TIME);
  91. }

  92. /* Send ACK bit to slave */
  93. I2C_DAT=send_ack;
  94. I2C_CLK=1;   /* SCL: High */
  95. CLK_SysTickDelay(I2C_DELAY_TIME);
  96. I2C_CLK=0;   /* SCL: Low */
  97. CLK_SysTickDelay(I2C_DELAY_TIME);

  98. return data;

  99. }

  100. /*---------------------------------------------------------------------------------------------------------*/
  101. /*  MAIN function                                                                                          */
  102. /*---------------------------------------------------------------------------------------------------------*/
  103. int main(void)
  104. {

  105.     SYS_Init();
  106.     UART0_Init();
  107.         I2C_init();
  108.         I2C_start();
  109.         printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_w));
  110.         printf("ack=0x%x,\n\r",I2C_write(0x00)); //eeprom address high
  111.         printf("ack=0x%x,\n\r",I2C_write(0x00));//eeprom address low
  112.         printf("ack=0x%x,\n\r",I2C_write(0x55));//write 0x55
  113.         I2C_stop();
  114.         CLK_SysTickDelay(10000); //delay 10ms
  115.         I2C_start();
  116.         printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_w));
  117.         printf("ack=0x%x,\n\r",I2C_write(0x00)); //eeprom address high
  118.         printf("ack=0x%x,\n\r",I2C_write(0x00));//eeprom address low
  119.         I2C_start();
  120.         printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_r));
  121.         printf("data=0x%x,\n\r",I2C_read(NO_ACK));
  122.         I2C_stop();
  123.         while(1);
  124.                
  125. }


捉虫天师 发表于 2016-12-27 23:51 | 显示全部楼层
下载收藏了,留着自己用。如果你规划的时候不好用硬件的,就只能IO模拟
gejigeji521 发表于 2016-12-30 00:08 | 显示全部楼层
读取外部的存储器啊,看看怎么做
nobleliom 发表于 2016-12-30 20:11 | 显示全部楼层
一般I2C的操作也不会用到很高的速度,大部分应用都是用IO模拟时序来操作的。
zhuotuzi 发表于 2017-1-21 17:43 | 显示全部楼层
这些外设的控制好多都是提供你时序图,比直接用I2C操作还方便。
捉虫天师 发表于 2017-1-22 19:09 | 显示全部楼层
void I2C_stop(void) {
  
/* I2C stop sequence is defined as
  * data pin is low, then CLK pin is high,
  * finally data pin is high. */
  I2C_DAT=0;
        I2C_CLK=1;
        I2C_DAT=1;
}
捉虫天师 发表于 2017-1-22 19:10 | 显示全部楼层
上面这个停止函数的,如果在51上更容易实现。
天灵灵地灵灵 发表于 2017-1-23 16:46 | 显示全部楼层
我认为IIC没有SPI好用,特别在GPIO模拟的时候。
wahahaheihei 发表于 2017-1-23 20:05 | 显示全部楼层
看起来这个I2C模拟的很熟悉
heisexingqisi 发表于 2017-1-25 16:07 | 显示全部楼层
用IO模拟端口,那是对通信协议的考验。
734774645 发表于 2017-1-25 21:52 | 显示全部楼层
应该找高手出个如何根据时序图改程序。
mintspring 发表于 2017-1-25 22:32 | 显示全部楼层
下载收藏了,学习一下模拟的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

310

帖子

6

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