专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
两个单片机之间进行模拟I2C通讯
2020-01-23 14:40
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
7658
25
25
有大侠做过两个单片机之间进行I2C通信的吗?一般单片机端当主机用两条数据线去模拟i2c当主机读取外围的从设备比较简单,但单片机端模拟从机与另外一个单片机模拟I2C当主机进行通信就没搞过了,有人这么做过吗,能否贴出单片机端模拟从机的I2C协议代码,研究一下
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
dr2001
1楼-- · 2020-01-24 08:47
精彩回答 2 元偷偷看……
加载中...
huhang
2楼-- · 2020-01-24 13:08
void SlaveI2C_Test(void)
{
start_scan(); //¼ì²âÆðʼÐźÅ
if(START_flag==1)
{
START_flag = 0; //¿ªÊ¼ÐźÅÇåÁã
I2C_rxadd(); //ÊÕÈ¡µØÖ·¼°ÃüÁî
//------------·´À¡½ÓÊÕÓ¦´ð------------
while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
SDA_OUT();
SDA_Reset;
while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
SDA_IN();
//------------------------------------
//------------------------------------
if(DEV_address == 0xa0 || DEV_address == 0xa1) //ÅжÏÊÇ·ñΪ±¾»úµØÖ·
{
m = 0; //³õʼ»¯m
if(R_W == 0) //Ö÷»úÏò±¾»úдÊý¾Ý
{
while(1)
{
I2C_Rec[m] = I2C_rxbyte();
//------------·´À¡½ÓÊÕÓ¦´ð------------
while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
SDA_OUT();
SDA_Reset;
while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
SDA_IN();
//------------------------------------
//------------STOP Ðźżì²â-----------
m++;
/* while(scl == 0){;}//¼ì²âSTOP
if(scl==1)
{
while(sda==0){;}
while(sda==1)
{
GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));
return;
}
}*/
//-------------------------------------
if(m == I2C_Rec[1])//³¤¶È×Ö·û
{
//STOP_flag = 1;
GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));
return;
}
}
}
else if(R_W == 1) //Ö÷»úÏò±¾»ú¶ÁÊý¾Ý
{
while(1)
{
I2C_txbyte(I2C_Send[m]);
m++;
//----------------½ÓÊÕÖ÷»úÓ¦´ð£¬´Ë¹¦ÄÜÖ÷»úÐèÒª¿ªÆôÏò´Ó»ú¶ÁÊý¾Ý³É¹¦ºó·¢Ë͵ÄÓ¦´ðÐźÅ----------------------------------
while(scl == 0){;}
while(scl == 1)
{
if(sda == 1)//½ÓÊÕµ½Ö÷»úÇëÇó¶ÁÊý¾ÝµÄ×îºóÒ»¸ö×Ö½ÚNACKʱ£¬Í£Ö¹·¢ËÍ
{
GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));
return;
}
}
//--------------------------------------------------------------------------------
//----------------½ÓÊչ̶¨³¤¶È×Ö½ÚÊý¾ÝºóÇ¿ÐÐÍ˳ö·¢ËÍ
/*if(m == 20)
{
//STROBE = 1;
GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));
return;
}*/
//--------------------------------------------------------------------------------------
}
}
}
}
}
加载中...
huhang
3楼-- · 2020-01-24 14:54
u8 I2C_rxbyte()
{
u8 i,j,k=0;
while(scl == 1); //µÈ´ýSCLÀµÍ
for(i = 0 ;i < 8 ;i++)
{
while( ! scl); //µÈ´ýSCLÓÉ0±äΪ1
if(sda == 1)
j = 1;
else
j = 0;
k=(k << 1) | j;
while(scl); //SCL¸ßµçƽʱµÈ´ý
}
return(k); //½«½ÓÊÕµ½µÄÊý¾Ý·µ»Ø
}
加载中...
huhang
4楼-- · 2020-01-24 19:59
void I2C_rxadd()
{
u8 i,j,k=0;
while(scl == 1);//µÈ´ýÖ÷»úÀµÍSCL
for(i = 0 ;i < 8 ;i++)
{
while( ! scl);//SCL=0ʱ£¬Ò»Ö±µÈ´ý£¬SCL=1ʱ¶ÁÈ¡SDAÊý¾Ý£¬Ö÷»úSCLµÈÓÚ1±ØÐë±£³ÖÒ»¶¨µÄʱ¼ä³¤¶È£¬²ÅÄܱ£Ö¤¿É¿¿¶ÁÈ¡//µÈ´ýSCLÓÉ0±äΪ1
if(sda == 1)
j = 1;
else
j = 0;
k=(k << 1) | j; //½«ÊÕµ½µÄλ·ÅÈëKÖÐ
while(scl == 1);//SCL¸ßµçƽʱµÈ´ý SCL=0ʱ¸Ãλ¶ÁÈ¡Íê³É£¬×¼±¸¶ÁÈ¡ÏÂÒ»BIT
}
R_W=k&0x01; //Ö÷»úÊǶÁ»¹ÊÇд
//DEV_address= (k >> 1) & 0x7f; //Çó³öÇ°7λµÄÉ豸µØÖ·
DEV_address = k;
}
加载中...
huhang
5楼-- · 2020-01-24 22:23
void I2C_txbyte(u8 dat_byte)
{
u8 i,temp;
temp = dat_byte;
//while(scl == 1); //SCLϽµÑØ¿ªÊ¼¶Á
//while(sda == 0); //µÈ´ýÖ÷»úÊÍ·ÅÊý¾Ý×ÜÏß
SDA_OUT();
for (i = 0 ;i < 8 ;i++) //´Ó×î¸ßλ¿ªÊ¼£¬ÒÀ´Î·¢ËÍ8λ
{
while(scl == 0); //µÈ´ýÖÃ1ºó¸øÖ÷»ú·¢ËÍÊý¾Ý
if(temp&0x80)
{
SDA_Set;
}
else
{
SDA_Reset;
}
temp = temp << 1;
//temp = temp << 1; //½«Òª·¢Ë͵ÄÊý×î¸ßλÒƵ½CYÖÐ
//sda = CY; //Êý¾ÝÏß·¢ËÍCYÖдæµÄλÊý¾Ý
//while(scl == 0);
//while(scl == 1);
while(scl == 1);//Ϊ1ʱµÈ´ýÖ÷»ú¶ÁÈ¡Êý¾Ý£¬Îª0ʱÖ÷»ú¶ÁÈ¡Íê³É¡£
//while(scl == 0); //
}
//sda = 1; //·¢ÍêÊÍ·ÅÊý¾Ý×ÜÏß
//SDA_Set;
SDA_IN();
}
加载中...
huhang
6楼-- · 2020-01-25 01:42
精彩回答 2 元偷偷看……
加载中...
上一页
1
2
3
4
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
{
start_scan(); //¼ì²âÆðʼÐźÅ
if(START_flag==1)
{
START_flag = 0; //¿ªÊ¼ÐźÅÇåÁã
I2C_rxadd(); //ÊÕÈ¡µØÖ·¼°ÃüÁî
//------------·´À¡½ÓÊÕÓ¦´ð------------
while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
SDA_OUT();
SDA_Reset;
while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
SDA_IN();
//------------------------------------
//------------------------------------
if(DEV_address == 0xa0 || DEV_address == 0xa1) //ÅжÏÊÇ·ñΪ±¾»úµØÖ·
{
m = 0; //³õʼ»¯m
if(R_W == 0) //Ö÷»úÏò±¾»úдÊý¾Ý
{
while(1)
{
I2C_Rec[m] = I2C_rxbyte();
//------------·´À¡½ÓÊÕÓ¦´ð------------
while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
SDA_OUT();
SDA_Reset;
while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
SDA_IN();
//------------------------------------
//------------STOP Ðźżì²â-----------
m++;
/* while(scl == 0){;}//¼ì²âSTOP
if(scl==1)
{
while(sda==0){;}
while(sda==1)
{
GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));
return;
}
}*/
//-------------------------------------
if(m == I2C_Rec[1])//³¤¶È×Ö·û
{
//STOP_flag = 1;
GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));
return;
}
}
}
else if(R_W == 1) //Ö÷»úÏò±¾»ú¶ÁÊý¾Ý
{
while(1)
{
I2C_txbyte(I2C_Send[m]);
m++;
//----------------½ÓÊÕÖ÷»úÓ¦´ð£¬´Ë¹¦ÄÜÖ÷»úÐèÒª¿ªÆôÏò´Ó»ú¶ÁÊý¾Ý³É¹¦ºó·¢Ë͵ÄÓ¦´ðÐźÅ----------------------------------
while(scl == 0){;}
while(scl == 1)
{
if(sda == 1)//½ÓÊÕµ½Ö÷»úÇëÇó¶ÁÊý¾ÝµÄ×îºóÒ»¸ö×Ö½ÚNACKʱ£¬Í£Ö¹·¢ËÍ
{
GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));
return;
}
}
//--------------------------------------------------------------------------------
//----------------½ÓÊչ̶¨³¤¶È×Ö½ÚÊý¾ÝºóÇ¿ÐÐÍ˳ö·¢ËÍ
/*if(m == 20)
{
//STROBE = 1;
GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));
return;
}*/
//--------------------------------------------------------------------------------------
}
}
}
}
}
{
u8 i,j,k=0;
while(scl == 1); //µÈ´ýSCLÀµÍ
for(i = 0 ;i < 8 ;i++)
{
while( ! scl); //µÈ´ýSCLÓÉ0±äΪ1
if(sda == 1)
j = 1;
else
j = 0;
k=(k << 1) | j;
while(scl); //SCL¸ßµçƽʱµÈ´ý
}
return(k); //½«½ÓÊÕµ½µÄÊý¾Ý·µ»Ø
}
{
u8 i,j,k=0;
while(scl == 1);//µÈ´ýÖ÷»úÀµÍSCL
for(i = 0 ;i < 8 ;i++)
{
while( ! scl);//SCL=0ʱ£¬Ò»Ö±µÈ´ý£¬SCL=1ʱ¶ÁÈ¡SDAÊý¾Ý£¬Ö÷»úSCLµÈÓÚ1±ØÐë±£³ÖÒ»¶¨µÄʱ¼ä³¤¶È£¬²ÅÄܱ£Ö¤¿É¿¿¶ÁÈ¡//µÈ´ýSCLÓÉ0±äΪ1
if(sda == 1)
j = 1;
else
j = 0;
k=(k << 1) | j; //½«ÊÕµ½µÄλ·ÅÈëKÖÐ
while(scl == 1);//SCL¸ßµçƽʱµÈ´ý SCL=0ʱ¸Ãλ¶ÁÈ¡Íê³É£¬×¼±¸¶ÁÈ¡ÏÂÒ»BIT
}
R_W=k&0x01; //Ö÷»úÊǶÁ»¹ÊÇд
//DEV_address= (k >> 1) & 0x7f; //Çó³öÇ°7λµÄÉ豸µØÖ·
DEV_address = k;
}
{
u8 i,temp;
temp = dat_byte;
//while(scl == 1); //SCLϽµÑØ¿ªÊ¼¶Á
//while(sda == 0); //µÈ´ýÖ÷»úÊÍ·ÅÊý¾Ý×ÜÏß
SDA_OUT();
for (i = 0 ;i < 8 ;i++) //´Ó×î¸ßλ¿ªÊ¼£¬ÒÀ´Î·¢ËÍ8λ
{
while(scl == 0); //µÈ´ýÖÃ1ºó¸øÖ÷»ú·¢ËÍÊý¾Ý
if(temp&0x80)
{
SDA_Set;
}
else
{
SDA_Reset;
}
temp = temp << 1;
//temp = temp << 1; //½«Òª·¢Ë͵ÄÊý×î¸ßλÒƵ½CYÖÐ
//sda = CY; //Êý¾ÝÏß·¢ËÍCYÖдæµÄλÊý¾Ý
//while(scl == 0);
//while(scl == 1);
while(scl == 1);//Ϊ1ʱµÈ´ýÖ÷»ú¶ÁÈ¡Êý¾Ý£¬Îª0ʱÖ÷»ú¶ÁÈ¡Íê³É¡£
//while(scl == 0); //
}
//sda = 1; //·¢ÍêÊÍ·ÅÊý¾Ý×ÜÏß
//SDA_Set;
SDA_IN();
}
一周热门 更多>