打印

给大家奉献一个IIC模拟接口的历程

[复制链接]
1118|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2016-12-18 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#ifndef _IIC_H_
#define _IIC_H_
//
#include "DrvGPIO.h"
#define AT24C01       127
#define AT24C02       255
#define AT24C04       511
#define AT24C08       1023
#define AT24C16       2047
#define AT24C32       4095
#define AT24C64       8191
#define AT24C128      16383
#define AT24C256      32767
//
#define EE_TYPE AT24C64
//
#define I2C_SCL_0()              GPIOA->DOUT&=~(1<<9)
#define I2C_SCL_1()           GPIOA->DOUT|=1<<9
#define I2C_SDA_0()              GPIOA->DOUT&=~(1<<8)
#define I2C_SDA_1()           GPIOA->DOUT|=1<<8
//
#define I2C_SDA_READ()        DrvGPIO_GetBit(E_GPA, 8)
//
void IIC_Start();
void IIC_Stop();
uint8_t IIC_Write_Byte(uint8_t _ucByte);
uint8_t IIC_Read_Byte();
uint8_t IIC_Get_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
static void IIC_Init(void);

//
static void i2c_Delay(void)
    {
    uint8_t i;
    for (i = 0; i < 10; i++)
        ;
    }
//
void IIC_Start()
    {
    I2C_SDA_1();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_0();
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
    }
//
void IIC_Stop(void)
    {
    I2C_SDA_0();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_1();
    }
//
uint8_t IIC_Write_Byte(uint8_t _ucByte)
    {
    uint8_t i;
    for (i = 0; i < 8; i++)
        {
        if (_ucByte & 0x80)
            {
            I2C_SDA_1();
            }
        else
            {
            I2C_SDA_0();
            }
        i2c_Delay();
        I2C_SCL_1();
        i2c_Delay();
        I2C_SCL_0();
        if (i == 7)
            {
            I2C_SDA_1();
            }
        _ucByte <<= 1;
        i2c_Delay();
        }
    return IIC_Get_Ack();
    }
//
uint8_t IIC_Read_Byte()
    {
    uint8_t i;
    uint8_t value;
    value = 0;
    for (i = 0; i < 8; i++)
        {
        value <<= 1;
        I2C_SCL_1();
        i2c_Delay();
        if (I2C_SDA_READ())
            {
            value++;
            }
        I2C_SCL_0();
        i2c_Delay();
        }
    return value;
    }
//
//
uint8_t IIC_Get_Ack(void)
    {
    uint8_t re;

    I2C_SDA_1();
    i2c_Delay();
    I2C_SCL_1();
    i2c_Delay();
    if (I2C_SDA_READ())
        {
        re = 1;
        }
    else
        {
        re = 0;
        }
    I2C_SCL_0();
    i2c_Delay();
    return re;
    }
//
void IIC_Ack(void)
    {
    I2C_SDA_0();
    i2c_Delay();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
    I2C_SDA_1();
    }
//
void IIC_NAck(void)
    {
    I2C_SDA_1();
    i2c_Delay();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
    }
//
static void IIC_Init(void)
    {
    DrvGPIO_Open(E_GPA, 8, E_IO_OPENDRAIN);
    DrvGPIO_Open(E_GPA, 9, E_IO_OPENDRAIN);
    i2c_Stop();
    }

#endif


相关帖子

沙发
wangjiahao88|  楼主 | 2016-12-18 11:09 | 只看该作者
#ifndef _AT24CXX_H_
#define _AT24CXX_H_
#include "MYFUN\IIC.H"
void AT24C64_Write_Byte(unsigned int addr,unsigned char dat);
void AT24C64_Write_Page(unsigned int addr,unsigned char *pbuf);
void AT24C64_Current_Addr_Read(unsigned int length,unsigned char *pbuf);
unsigned char AT24C64_Read_Byte(unsigned int addr);
void AT24C64_Sequential_Read(unsigned int addr,unsigned int length,unsigned char *pbuf);
//

void AT24C64_Write_Byte(unsigned int addr,unsigned char dat)
{
    IIC_Start();
    IIC_Write_Byte(0xa0);
    IIC_Write_Byte(addr>>8);
    IIC_Write_Byte(addr);
    IIC_Write_Byte(dat);
    IIC_Stop();
    DELAY(5000);
}
void AT24C64_Write_Page(unsigned int addr,unsigned char *pbuf)
{
    unsigned char i;
    IIC_Start();
    IIC_Write_Byte(0xa0);
    IIC_Write_Byte(addr>>8);
    IIC_Write_Byte(addr);
    for(i=0; i<32; i++)
    {
        IIC_Write_Byte(pbuf[i]);
    }
    IIC_Stop();

    DELAY(5000);
}
void AT24C64_Current_Addr_Read(unsigned int length,unsigned char *pbuf)
{
    unsigned char i;
    IIC_Start();
    IIC_Write_Byte(0xa1);
    for(i=0; i<length-1; i++)
    {
        pbuf[i]=IIC_Read_Byte();
        IIC_Ack();
    }
    pbuf[i]=IIC_Read_Byte();
    IIC_NAck();
    IIC_Stop();
}
unsigned char AT24C64_Read_Byte(unsigned int addr)
{
    unsigned char temp;

    IIC_Start();
    IIC_Write_Byte(0xa0);
    IIC_Write_Byte(addr>>8);
    IIC_Write_Byte(addr);
    AT24C64_Current_Addr_Read(1,&temp);
    return temp;
}
void AT24C64_Sequential_Read(unsigned int addr,unsigned int length,unsigned char *pbuf)
{
    IIC_Start();
    IIC_Write_Byte(0xa0);
    IIC_Write_Byte(addr>>8);
    IIC_Write_Byte(addr);
    AT24C64_Current_Addr_Read(length,pbuf);
}
#endif

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2016-12-18 11:09 | 只看该作者
#ifndef _MYFUN_H_
#define _MYFUN_H_
//NOP延时
void DELAY(uint32_t COUNT)
    {
    while (COUNT--)
        {
        __NOP();
        }
    }
//系统初始化
void SYSinit()
    {
    UNLOCKREG();
    SYSCLK->PLLCON.OE = 1;
    SYSCLK->PWRCON.XTL12M_EN = 1;
    }
uint8_t const BUHEGE_BUF[][70] =
    {
            "$,VOL+,TEST_disqualified;",
            "$,VOL-,TEST_disqualified;",
            "$,PAGE+,TEST_disqualified;",
            "$,PAGE-,TEST_disqualified;",
            "$,SCR,TEST_disqualified;",
            "$,MUTE,TEST_disqualified;"
    };
#endif

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2016-12-18 11:10 | 只看该作者
#ifndef _PCF8563_H_
#define _PCF8563_H_
#include "MYFUN\IIC.H"
struct Time time;
struct Time
    {
        unsigned char second;
        unsigned char minute;
        unsigned char hour;
        unsigned char day;
        unsigned char week;
        unsigned char month;
        unsigned char year;
    };
struct DownCounter
    {
        unsigned char set_value;
        unsigned char dcounter_value;
    };
extern struct Time time;
extern struct DownCounter dcounter;
unsigned char P8563_Read_Time();
unsigned char P8563_Set_Time();
unsigned char P8563_Read_DownCounter();
unsigned char P8563_Set_DownCounter();
//
unsigned char PCF8563_Write_Bytes(unsigned char addr, unsigned char length,
        unsigned char *pbuf)
    {
    unsigned char i = 0;
    IIC_Start();
    if (IIC_Write_Byte(0xa2))
        return 1;
    if (IIC_Write_Byte(addr))
        return 1;
    for (i = 0; i < length; i++)
        {
        if (IIC_Write_Byte(pbuf[i]))
            return 1;
        }
    IIC_Stop();
    return 0;
    }
unsigned char PCF8563_Read_Bytes(unsigned char addr, unsigned char length,
        unsigned char *pbuf)
    {
    unsigned char i = 0, err = 0;
    IIC_Start();
    if (IIC_Write_Byte(0xa2))
        return 1;
    if (IIC_Write_Byte(addr))
        return 1;
    IIC_Start();
    if (IIC_Write_Byte(0xa3))
        return 1;
    for (i = 0; i < length - 1; i++)
        {
        pbuf[i] = IIC_Read_Byte();
        IIC_Ack();
        }
    pbuf[i] = IIC_Read_Byte();
    IIC_NAck();
    IIC_Stop();
    return 0;
    }
unsigned char BCD2Val(unsigned char x)
    {
    return (x >> 4) * 10 + (x & 0x0f);
    }
unsigned char Val2BCD(unsigned char x)
    {
    return (x / 10) * 16 + (x % 10);
    }
unsigned char P8563_Read_Time()
    {
    unsigned char temp[7];
    if (!PCF8563_Read_Bytes(0x02, 7, temp))
        {
        time.second = BCD2Val(temp[0] & 0x7f);
        time.minute = BCD2Val(temp[1] & 0x7f);
        time.hour = BCD2Val(temp[2] & 0x3f);
        time.day = BCD2Val(temp[3] & 0x3f);
        time.week = BCD2Val(temp[4] & 0x07);
        time.month = BCD2Val(temp[5] & 0x1f);
        time.year = BCD2Val(temp[6]);
        return 0;
        }
    else
        return 1;
    }
unsigned char P8563_Set_Time()
    {
    unsigned char temp[7];
    unsigned char i;
    for (i = 0; i < 7; i++)
        {
        temp[i] = Val2BCD(((unsigned char *) (&time))[i]);
        }
    return PCF8563_Write_Bytes(0x02, 7, temp);
    }
unsigned char P8563_Set_DownCounter()
    {
    return PCF8563_Write_Bytes(0x0e, 2, (unsigned char *) &dcounter);
    }

#endif

使用特权

评论回复
5
wangjiahao88|  楼主 | 2016-12-18 11:11 | 只看该作者
#ifndef _UART_H_
#define _UART_H_
//中断函数
void UART0_INT_HANDLE(uint32_t u32IntStatus); //UART0中断
//配置串口0
void RS232_1_init() //初始化串口0
    {
    STR_UART_T UARTInitStructure;
    SYS->GPBMFP.UART0_RX = 1;
    SYS->GPBMFP.UART0_TX = 1;
    UART0->FCR.RFR = 1;
    UARTInitStructure.u32BaudRate = 9600;
    UARTInitStructure.u8cDataBits = DRVUART_DATABITS_8;
    UARTInitStructure.u8cStopBits = DRVUART_STOPBITS_1;
    UARTInitStructure.u8cParity = DRVUART_PARITY_NONE;
    UARTInitStructure.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
    UARTInitStructure.u8TimeOut = 0;
    DrvUART_Open(UART_PORT0, &UARTInitStructure);
    DrvUART_EnableInt(UART_PORT0, DRVUART_RDAINT, UART0_INT_HANDLE);
    }
//发送一个字节
void SendChar_ch(char ch)
    {
    UART0->DATA = ch;
    }

void SendChar(char *ch)
    {
    while (*ch != '\0')
        {
        DELAY(200);
        UART0->DATA = *ch;
        DELAY(200);
        ch++;
        }
    }
//发送回车
void UART_Send_Enter()
    {
    UART0->DATA = 0x0d;
    UART0->DATA = 0x0a;
    }
//串口0中断
void UART0_INT_HANDLE(uint32_t u32IntStatus)
    {
    if (u32IntStatus & DRVUART_RDAINT)
        {
        /* Get all the input characters */
        while (UART0->ISR.RDA_IF == 1)
            {
            }
        }
    }
#endif

使用特权

评论回复
6
wangjiahao88|  楼主 | 2016-12-18 11:12 | 只看该作者
好了!

最核心的源码已经发完了。

希望大家可以借鉴一下!

我们可以展开讨论。

这个是我一直沿用很多次设计上的一个驱动吧算是。

使用特权

评论回复
7
wangjiahao88|  楼主 | 2016-12-18 11:13 | 只看该作者
上传一下文件。

其实写的并不标准,写到了头文件里面。

使用特权

评论回复
8
wangjiahao88|  楼主 | 2016-12-18 11:15 | 只看该作者
AT24CXX

AT24CXX.zip

531 Bytes

使用特权

评论回复
9
wangjiahao88|  楼主 | 2016-12-18 11:17 | 只看该作者
IIC

IIC.zip

783 Bytes

使用特权

评论回复
10
wangjiahao88|  楼主 | 2016-12-18 11:18 | 只看该作者
MYFUN

MYFUN.zip

436 Bytes

使用特权

评论回复
11
wangjiahao88|  楼主 | 2016-12-18 11:19 | 只看该作者
RTC   8563

PCF8563.zip

793 Bytes

使用特权

评论回复
12
wangjiahao88|  楼主 | 2016-12-18 11:19 | 只看该作者
uart 串口

UART.zip

719 Bytes

使用特权

评论回复
13
東南博士| | 2016-12-18 11:24 | 只看该作者
这个是可以应用在很多MCU上面吗?

包括 51 AVR DSP ARM吗?

这种最好是通用的 才有参考价值!

使用特权

评论回复
14
wangjiahao88|  楼主 | 2016-12-18 20:45 | 只看该作者
这个 是通用的 用的时候 注意一下 延时部分

使用特权

评论回复
15
@若水| | 2017-1-12 15:21 | 只看该作者

使用特权

评论回复
16
wangjiahao88|  楼主 | 2017-1-18 16:18 | 只看该作者
希望我们一起探讨!

谢谢哦!

使用特权

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

本版积分规则

473

主题

7517

帖子

30

粉丝