打印
[DemoCode下载]

GPIO模擬I2C存取EEPROM

[复制链接]
1225|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_ziliu|  楼主 | 2016-12-26 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GPIO模擬I2C存取EEPROM
EC_NUC230_240_GPIO_I2C.zip (958.82 KB)

EC_NUC230_240_GPIO_I2C.zip

958.82 KB

沙发
643757107| | 2016-12-26 14:44 | 只看该作者
楼主是GPIO模拟高手啊

使用特权

评论回复
板凳
598330983| | 2016-12-26 17:11 | 只看该作者
不知道这个是什么型号的EEPROM。

使用特权

评论回复
地板
稳稳の幸福| | 2016-12-26 22:36 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 3 $
* $Date: 15/08/18 11:54a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    NUC200 Series LED Controller Sample Code
*
* @note
* Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NUC230_240.h"
#include "NuEdu-Basic01.h"
#define I2C_ADDRESS_w 0xa0
#define I2C_ADDRESS_r 0xa1
#define I2C_DELAY_TIME  10 /* us */
#define ACK   0
#define NO_ACK   1
#define I2C_CLK PA11
#define I2C_DAT PA10
void I2C_init(void) {
GPIO_SetMode(PA, BIT10, GPIO_PMD_OPEN_DRAIN);//I2C_CLK
GPIO_SetMode(PA, BIT11, GPIO_PMD_OPEN_DRAIN);//I2C_DAT
I2C_CLK=1;
I2C_DAT=1;
}

void I2C_start(void) {

/* I2C start sequence is defined as
  * a High to Low Transition on the data
  * line as the CLK pin is high */
I2C_DAT=1;
I2C_CLK=1;
CLK_SysTickDelay(I2C_DELAY_TIME);
I2C_DAT=0;
I2C_CLK=0;
CLK_SysTickDelay(I2C_DELAY_TIME);
}

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;
}

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

unsigned char i,temp;

/* Write to slave */
for(i = 0; i < 8; i++)
        {  
        /* Send data bit */
        if((data&0x80)==0x80)        
                I2C_DAT=1;
          else
                        I2C_DAT=0;
  data <<= 1;   /* Shift one bit */
  I2C_CLK=1; /* SCL: High */
  CLK_SysTickDelay(I2C_DELAY_TIME);
  I2C_CLK=0; /* SCL: Low */
  CLK_SysTickDelay(I2C_DELAY_TIME);
}
I2C_DAT=1;

I2C_CLK=1;  /* SCL: High */
CLK_SysTickDelay(I2C_DELAY_TIME/2);
temp=I2C_DAT; /* Read ACK bit from slave */
CLK_SysTickDelay(I2C_DELAY_TIME/2);
I2C_CLK=0;  /* SCL: Low */
CLK_SysTickDelay(I2C_DELAY_TIME);
return temp;
}

unsigned char I2C_read(unsigned char send_ack)
{
  
unsigned char i, data;

data = 0x00;

/* Read from slave */
for(i = 0; i < 8; i++) {
  data <<= 1;   /* Shift one bit */
  data |= I2C_DAT; /* Read data bit */
  I2C_CLK=1; /* SCL: High */
  CLK_SysTickDelay(I2C_DELAY_TIME);
  I2C_CLK=0; /* SCL: Low */
  CLK_SysTickDelay(I2C_DELAY_TIME);
}

/* Send ACK bit to slave */
I2C_DAT=send_ack;
I2C_CLK=1;   /* SCL: High */
CLK_SysTickDelay(I2C_DELAY_TIME);
I2C_CLK=0;   /* SCL: Low */
CLK_SysTickDelay(I2C_DELAY_TIME);

return data;

}

/*---------------------------------------------------------------------------------------------------------*/
/*  MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{

    SYS_Init();
    UART0_Init();
        I2C_init();
        I2C_start();
        printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_w));
        printf("ack=0x%x,\n\r",I2C_write(0x00)); //eeprom address high
        printf("ack=0x%x,\n\r",I2C_write(0x00));//eeprom address low
        printf("ack=0x%x,\n\r",I2C_write(0x55));//write 0x55
        I2C_stop();
        CLK_SysTickDelay(10000); //delay 10ms
        I2C_start();
        printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_w));
        printf("ack=0x%x,\n\r",I2C_write(0x00)); //eeprom address high
        printf("ack=0x%x,\n\r",I2C_write(0x00));//eeprom address low
        I2C_start();
        printf("ack=0x%x,\n\r",I2C_write(I2C_ADDRESS_r));
        printf("data=0x%x,\n\r",I2C_read(NO_ACK));
        I2C_stop();
        while(1);
               
}


使用特权

评论回复
5
捉虫天师| | 2016-12-27 23:51 | 只看该作者
下载收藏了,留着自己用。如果你规划的时候不好用硬件的,就只能IO模拟

使用特权

评论回复
6
gejigeji521| | 2016-12-30 00:08 | 只看该作者
读取外部的存储器啊,看看怎么做

使用特权

评论回复
7
nobleliom| | 2016-12-30 20:11 | 只看该作者
一般I2C的操作也不会用到很高的速度,大部分应用都是用IO模拟时序来操作的。

使用特权

评论回复
8
zhuotuzi| | 2017-1-21 17:43 | 只看该作者
这些外设的控制好多都是提供你时序图,比直接用I2C操作还方便。

使用特权

评论回复
9
捉虫天师| | 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;
}

使用特权

评论回复
10
捉虫天师| | 2017-1-22 19:10 | 只看该作者
上面这个停止函数的,如果在51上更容易实现。

使用特权

评论回复
11
天灵灵地灵灵| | 2017-1-23 16:46 | 只看该作者
我认为IIC没有SPI好用,特别在GPIO模拟的时候。

使用特权

评论回复
12
wahahaheihei| | 2017-1-23 20:05 | 只看该作者
看起来这个I2C模拟的很熟悉

使用特权

评论回复
13
heisexingqisi| | 2017-1-25 16:07 | 只看该作者
用IO模拟端口,那是对通信协议的考验。

使用特权

评论回复
14
734774645| | 2017-1-25 21:52 | 只看该作者
应该找高手出个如何根据时序图改程序。

使用特权

评论回复
15
mintspring| | 2017-1-25 22:32 | 只看该作者
下载收藏了,学习一下模拟的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

295

帖子

6

粉丝