⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 该工程文件包含了 myson系列mtv018/130 osd芯片的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 + -