标题:
关于C语言I2C协议实现写入函数的问题
[打印本页]
作者:
tanso
时间:
2015-2-17 13:53
标题:
关于C语言I2C协议实现写入函数的问题
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P2^0;
sbit SCL = P2^1;
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
void i2c_init()
{
SDA = 1;
SCL = 1;
}
void i2c_start()
{
SDA = 1;
SCL = 1;
delay();
SDA = 0;
delay();
SCL = 0;
delay();
}
void i2c_stop()
{
SDA = 0;
SCL = 1;
delay();
SDA = 1;
delay();
}
bit wait_ack()
{
bit a;
uchar i = 0;
SDA = 1;
delay();
SCL = 1;
delay();
while (SDA == 1 && i < 250) i++;
a = SDA;
SCL = 0;
delay();
return a;
}
void i2c_write(uchar dat)
{
uchar i;
/*
for(i = 0; i < 8; i++) {
SCL = 0;
delay();
dat <<= 1;
SDA = CY;
delay();
SCL = 1;
delay();
}
*/
for(i = 0; i < 8; i++) { // send the data bit by bit
SCL = 0;
delay();
dat <<= 1;
SDA = CY;
delay();
SCL = 1;
delay();
SCL = 0;
delay();
}
wait_ack();
}
uchar i2c_read()
{
uchar i, temp = 0;
for(i = 0; i < 8; i++) {
temp <<= 1;
SCL = 0;
delay();
SCL = 1;
delay();
temp |= SDA;
}
return temp;
}
void write_addr(uchar addr, uchar dat)
{
i2c_start();
i2c_write(0xa0);
i2c_write(addr);
i2c_write(dat);
i2c_stop();
delaynms(4);
}
uchar read_addr(uchar addr)
{
uchar temp;
i2c_start();
i2c_write(0xa0);
i2c_write(addr);
i2c_start();
i2c_write(0xa1);
temp = i2c_read();
i2c_stop();
return temp;
}
void main()
{
i2c_init();
write_addr(0x00, 0xee);
P1 = read_addr(0x00);
while(1);
}
复制代码
程序其余部分应该没有问题,其中注释部分只不过将拉低SCL电平的时机变动了一下,怎么就会写入失败了呢?
作者:
ywrong
时间:
2015-2-17 21:30
学习
作者:
goahead!
时间:
2015-3-9 10:30
#include<intrins.h> #define uchar unsigned char sbit sda = P1^7; sbit scl = P1^1; /****************************I2C总线开始*************************/ void start_24c04(void) { sda = 1; _nop_(); scl = 1; _nop_(); sda = 0; _nop_(); scl = 0; } /****************************I2C总线停止*************************/ void stop_24c04(void) { sda = 0; _nop_(); scl = 1; _nop_(); sda = 1; _nop_(); } /*****************************应答程序**************************/ void ack_24c04(void) { uchar i = 255; scl = 1; _nop_(); while(sda && i--); scl = 0; _nop_(); } /***************************I2C总线初始化************************/ void init_24c04(void) { sda = 1;_nop_();//常态 scl = 0;_nop_();//常态 } /***************************读取一个字节*************************/ uchar read_onebyte_24c04(void) { uchar i,dat; sda = 1; // 释放总线 for(i = 0;i < 8;i++) { scl = 1; dat = dat << 1; if(sda)dat = dat | 0x01; scl = 0; } sda = 1;scl = 0; return(dat); } /*****************************写入一个字节**********************/ void write_onebyte_24c04(uchar dat) { uchar i; for(i = 0;i < 8;i++) { sda = (bit)(dat & 0x80); dat = dat << 1; scl = 1; scl = 0; } sda = 1;scl = 0; } /*********************对某个地址写一个字节的数据***********************/ void write_add_dat_24c04(uchar add,uchar dat) { start_24c04(); write_onebyte_24c04(0xa0); ack_24c04(); write_onebyte_24c04(add); ack_24c04(); write_onebyte_24c04(dat); ack_24c04(); stop_24c04(); } /********************读取某个地址一个字节的数据*******************/ uchar read_add_dat_24c04(uchar add) { uchar dat; start_24c04(); write_onebyte_24c04(0xa0); ack_24c04(); write_onebyte_24c04(add); ack_24c04(); start_24c04(); write_onebyte_24c04(0xa1); ack_24c04(); dat = read_onebyte_24c04(); stop_24c04(); return(dat); }
作者:
goahead!
时间:
2015-3-9 10:30
#include<intrins.h>
#define uchar unsigned char
sbit sda = P1^7;
sbit scl = P1^1;
/****************************I2C总线开始*************************/
void start_24c04(void)
{
sda = 1;
_nop_();
scl = 1;
_nop_();
sda = 0;
_nop_();
scl = 0;
}
/****************************I2C总线停止*************************/
void stop_24c04(void)
{
sda = 0;
_nop_();
scl = 1;
_nop_();
sda = 1;
_nop_();
}
/*****************************应答程序**************************/
void ack_24c04(void)
{
uchar i = 255;
scl = 1;
_nop_();
while(sda && i--);
scl = 0;
_nop_();
}
/***************************I2C总线初始化************************/
void init_24c04(void)
{
sda = 1;_nop_();//常态
scl = 0;_nop_();//常态
}
/***************************读取一个字节*************************/
uchar read_onebyte_24c04(void)
{
uchar i,dat;
sda = 1; // 释放总线
for(i = 0;i < 8;i++)
{
scl = 1;
dat = dat << 1;
if(sda)dat = dat | 0x01;
scl = 0;
}
sda = 1;scl = 0;
return(dat);
}
/*****************************写入一个字节**********************/
void write_onebyte_24c04(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++)
{
sda = (bit)(dat & 0x80);
dat = dat << 1;
scl = 1;
scl = 0;
}
sda = 1;scl = 0;
}
/*********************对某个地址写一个字节的数据***********************/
void write_add_dat_24c04(uchar add,uchar dat)
{
start_24c04();
write_onebyte_24c04(0xa0);
ack_24c04();
write_onebyte_24c04(add);
ack_24c04();
write_onebyte_24c04(dat);
ack_24c04();
stop_24c04();
}
/********************读取某个地址一个字节的数据*******************/
uchar read_add_dat_24c04(uchar add)
{
uchar dat;
start_24c04();
write_onebyte_24c04(0xa0);
ack_24c04();
write_onebyte_24c04(add);
ack_24c04();
start_24c04();
write_onebyte_24c04(0xa1);
ack_24c04();
dat = read_onebyte_24c04();
stop_24c04();
return(dat);
}
作者:
goahead!
时间:
2015-3-9 10:31
goahead! 发表于 2015-3-9 10:30
#include
#define uchar unsigned char
sbit sda = P1^7;
这个没什么问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1