打印
[文档下载]

MUC1XX之24C64驱动

[复制链接]
1998|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-1-26 20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvI2C.h"
#include "Driver\DrvSYS.h"
#include "EEPROM_I2C_24LC64.h"

void Write_24LC64(uint32_t address,uint8_t data )
{
        uint32_t i;
        SystemCoreClock = DrvSYS_GetHCLKFreq();
  //Open I2C1 and set clock = 50Kbps
        DrvI2C_Open(I2C_PORT1, 50000);
       
           //send i2c start
        DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0);        //set start
        while (I2C1->I2CON.SI == 0);                        //poll si flag
        //send writer command
        I2C1->I2CDAT = 0XA0;                                        //send writer command
    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0); //clr si flag
    while( I2C1->I2CON.SI == 0 );                    //poll si flag
        //send address high
        I2C1->I2CDAT = (address>>8)&0XFF;       
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
        while( I2C1->I2CON.SI == 0 );                        //poll si flag
        //send address low
        I2C1->I2CDAT = address&0XFF;       
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
        while( I2C1->I2CON.SI == 0 );                        //poll si flag
        //send data
        I2C1->I2CDAT = data;                                        //write data to
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //clr si and set ack       
        while( I2C1->I2CON.SI == 0 );                        //poll si flag
           //send i2c stop
        DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //send stop       
        while( I2C1->I2CON.STO);
        //while( I2C1->CON.SI == 0 );
        for(i=0;i<60;i++);
        DrvI2C_Close(I2C_PORT1);
         
        for(i=0;i<6000;i++);
        for(i=0;i<6000;i++);
}

uint8_t Read_24LC64(uint32_t address)
{
        uint8_t TEMP;
  //Open I2C1 and set clock = 50Kbps
        SystemCoreClock = DrvSYS_GetHCLKFreq();
        DrvI2C_Open(I2C_PORT1, 50000);
        //send i2c start
    DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);                 //set start
        while (I2C1->I2CON.SI == 0);                                //poll si flag
         
           //send writer command
        I2C1->I2CDAT = 0XA0;
    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);           //clr si
    while( I2C1->I2CON.SI == 0 );                           //poll si flag
       
        //send address high
    I2C1->I2CDAT = (address>>8)&0XFF;       
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si and set ack
        while( I2C1->I2CON.SI == 0 );                           //poll si flag
   
        //send address low
        I2C1->I2CDAT = address&0XFF;       
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si        and set ack
        while( I2C1->I2CON.SI == 0 );                           //poll si flag
       
        //send start flag
        DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);    //clr si and send start       
        while( I2C1->I2CON.SI == 0 );                           //poll si flag
       
        //send read command
        I2C1->I2CDAT = 0XA1;
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);    //clr si
    while( I2C1->I2CON.SI == 0 );                           //poll si flag

        //resive data
        I2C1->I2CDAT = 0XFF;
        DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);    //clr si       
        while( I2C1->I2CON.SI == 0 );                           //poll si flag
        TEMP= I2C1->I2CDAT;
        //send i2c stop
        DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);    //clr si and set stop
        while( I2C1->I2CON.STO);
        DrvI2C_Close(I2C_PORT1);

        return TEMP;
}


沙发
niuyaliang|  楼主 | 2014-1-26 20:14 | 只看该作者
#ifndef __EEPROM_I2C_24LC64_H__
#define __EEPROM_I2C_24LC64_H__
     
extern void Write_24LC64(uint32_t address,uint8_t data);
extern uint8_t Read_24LC64(uint32_t address);
#endif


使用特权

评论回复
板凳
niuyaliang|  楼主 | 2014-1-31 23:12 | 只看该作者
:lol这么霸气外漏的驱动没人顶居然

使用特权

评论回复
地板
wangfeng0198| | 2014-2-1 08:26 | 只看该作者
ding ding ding

使用特权

评论回复
5
zxf0168| | 2014-2-1 22:30 | 只看该作者
我帮你顶一下楼主

使用特权

评论回复
6
zxf0168| | 2014-2-13 14:41 | 只看该作者
niuyaliang 发表于 2014-1-31 23:12
这么霸气外漏的驱动没人顶居然

谁说没人顶,只可惜我看不到

使用特权

评论回复
7
a2358767921| | 2014-8-15 11:34 | 只看该作者
虚心向大伙学习

使用特权

评论回复
8
530120101| | 2014-8-15 11:36 | 只看该作者

使用特权

评论回复
9
lqc754| | 2014-8-16 13:49 | 只看该作者
学习!

使用特权

评论回复
10
mintspring| | 2014-8-18 20:14 | 只看该作者
我顶,楼主太给力了,我说,是你自己写的吗?

使用特权

评论回复
11
niuyaliang|  楼主 | 2014-8-25 09:55 | 只看该作者
mintspring 发表于 2014-8-18 20:14
我顶,楼主太给力了,我说,是你自己写的吗?

直接copy的,不是自己写的

使用特权

评论回复
12
mintspring| | 2014-8-25 19:17 | 只看该作者
niuyaliang 发表于 2014-8-25 09:55
直接copy的,不是自己写的

是个IIC的驱动啊。

使用特权

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

本版积分规则

212

主题

2427

帖子

7

粉丝