📄 i2c.c
字号:
#pragma REGISTERBANK(0)
#include <reg52.h>
#include <intrins.h>
//#include "def.h"
//#include "timer.h"
//#include "delay.h"
sbit SCK = P0 ^ 6;
sbit SDA = P0 ^ 7;
extern void i2c_init(void);
void mdelay(unsigned char delay)
{
unsigned char i;
for(i = 0;i<= delay;i++){
_nop_();_nop_();
_nop_();_nop_();
}
}
static void i2c_delay(void)
{
_nop_(); _nop_();
_nop_(); _nop_();
}
static void i2c_start(void)
{
SDA = 0;
i2c_delay();
}
static void i2c_restart(void)
{
SCK = 0;
SDA = 1;
i2c_delay();
SCK = 1;
i2c_delay();
SDA = 0;
i2c_delay();
}
static void i2c_stop(void)
{
SCK = 0;
SDA = 0;
i2c_delay();
SCK = 1;
i2c_delay();
SDA = 1;
i2c_delay();
}
static void i2c_outb(unsigned char c)
{
unsigned char i;
for (i = 0; i < 8; i++) {
SCK = 0;
SDA = (c & 0x80);
i2c_delay();
SCK = 1;
i2c_delay();
c <<= 1;
}
}
static unsigned char i2c_inb(void)
{
unsigned char i,c = 0;
for (i = 0; i < 8; i++) {
c <<= 1;
SCK = 0;
SDA = 1;
i2c_delay();
SCK = 1;
i2c_delay();
if (SDA)
c |= 1;
}
return c;
}
static bit wait_for_pin(void)
{
unsigned char loops = 255;
SCK = 0;
SDA = 1;
i2c_delay();
SCK = 1;
while (SDA && --loops)
_nop_();
return !SDA;
}
static void do_ack(void)
{
SCK = 0;
SDA = 0;
i2c_delay();
SCK = 1;
i2c_delay();
}
static bit i2c_send(const unsigned char data *buf, unsigned char count)
{
while (count) {
i2c_outb(*buf);
if (!wait_for_pin()) {
return 0;
}
buf++;
count--;
}
return 1;
}
static bit i2c_recv(unsigned char data *buf, count)
{
if (count == 0)
return 1;
for (;;) {
*buf = i2c_inb();
buf++;
count--;
if (count == 0)
break;
do_ack();
}
return 1;
}
bit i2c_xfer(unsigned char addr, unsigned char data *buf, unsigned char count)
{
bit ret = 0;
i2c_start();
i2c_outb(addr);
if (!wait_for_pin())
goto out;
if (addr & 1)
ret = i2c_recv(buf, count);
else
ret = i2c_send(buf, count);
out:
i2c_stop();
return ret;
}
#define AT_ADDR 0x50
static bit at24cxx_poll(bit read)
{
bit ret = 0;
i2c_start();
i2c_outb(read ? ((AT_ADDR<<1)|1) : (AT_ADDR<<1));
if (wait_for_pin())
return 1;
return 0;
}
bit at24cxx_writebyte(unsigned char addr, unsigned char c)
{
bit ret = 0;
if (!at24cxx_poll(0))
goto out;
i2c_outb(addr);
if (!wait_for_pin())
goto out;
i2c_outb(c);
if (!wait_for_pin())
goto out;
ret = 1;
out:
i2c_stop();
if (ret) {
mdelay(20);
}
return ret;
}
bit at24cxx_read(unsigned char addr, unsigned char data *buf, unsigned char count)
{
bit ret = 0;
if (!at24cxx_poll(0))
goto out;
i2c_outb(addr);
if (!wait_for_pin())
goto out;
i2c_restart();
i2c_outb((AT_ADDR<<1)|1);
if (!wait_for_pin())
goto out;
ret = i2c_recv(buf, count);
out:
i2c_stop();
return ret;
}
void i2c_init(void)
{
SCK = 1;
SDA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -