搜索
bottom↓
回复: 5

【请教430普通IO口模拟I2C通信的方法。。】

[复制链接]

出0入0汤圆

发表于 2012-7-26 13:35:14 | 显示全部楼层 |阅读模式
所用的MCU是MSP430F5438。由于需要用到4组需要I2C的外围传感器,而该传感器不能串联使用,所以用了8个普通的IO口模拟I2C功能。

对于每个传感器模块,程序中需要一个IO口控制对方的DATA脚。该IO口需要输出高低电平以模拟通信时序(因此设成输出模式)。在读取数据前,需要给DATA输出高电平,然后通过判断此IO口外部的电平状态,对数据进行读取。


现在问题是,控制DATA的IO口一直是作为输出口进行应用控制,而读取数据时,又得查询该IO的状态(类似读PxIN。PxOUT只存储程序给出的输出状态,不能反映外部电平)。


请问高手们,该功能应该通过什么方式实现呢?

谢谢!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-7-26 14:55:40 | 显示全部楼层
写DATA时,IO配置为输出
读DATA时,IO配置为输入

出0入0汤圆

 楼主| 发表于 2012-7-26 20:09:06 | 显示全部楼层
本帖最后由 cspiao 于 2012-7-26 20:11 编辑
lcw_swust 发表于 2012-7-26 14:55
写DATA时,IO配置为输出
读DATA时,IO配置为输入

可以这样操作?
像下面这个51函数里的,操作那么频繁。

INT8 s_read_byte(UINT8 ack)  
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"  
{
  UINT8 i, val = 0;

  DATA = 1;                                //release DATA-line
  for(i = 0x80; i > 0; i /= 2)                //shift bit for masking
  {
    SCK = 1;                                //clk for SENSI-BUS
    if(DATA)
    {
      val = (val | i);                        //read bit
    }
    _nop_();
    _nop_();
    _nop_();                                //pulswith approx. 3 us
    SCK = 0;
  }
  if(ack == 1)
  {
    DATA = 0;                                //in case of "ack==1" pull down DATA-Line
  }
  else
  {
    DATA = 1;                                //如果是校验(ack==0),读取完后结束通讯
  }
  _nop_();
  _nop_();
  _nop_();                                //pulswith approx. 3 us

  SCK = 1;                                //clk #9 for ack
  _nop_();
  _nop_();
  _nop_();                                //pulswith approx. 3 us

  SCK = 0;
  _nop_();
  _nop_();
  _nop_();                                //pulswith approx. 3 us

  DATA = 1;                                //release DATA-line

  return val;
}

出0入0汤圆

发表于 2012-7-26 20:45:10 | 显示全部楼层
cspiao 发表于 2012-7-26 20:09
可以这样操作?
像下面这个51函数里的,操作那么频繁。

操作那么频繁,单片机也不会觉得累的

出0入0汤圆

发表于 2012-7-26 23:48:47 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2012-7-27 13:36:20 | 显示全部楼层
lcw_swust 发表于 2012-7-26 14:55
写DATA时,IO配置为输出
读DATA时,IO配置为输入

网上参考了一段程序,还真是这么回事。

#include <msp430x16x.h>
#define SDA_IN            P5DIR &=~BIT0    // P5.0 IN
#define SDA_OUT           P5DIR |=BIT0     // P5.0 OUT

#define SDA_LOW           P5OUT &=~BIT0   // sda=0
#define SDA_HIGH          P5OUT |=BIT0   // sda=1

#define SCL_IN            P5DIR &=~BIT1    // P5.1 IN
#define SCL_OUT           P5DIR |=BIT1    // P5.1 OUT

#define SCL_LOW           P5OUT &=~BIT1
#define SCL_HIGH          P5OUT |=BIT1


unsigned char i2c_check_ACK(void)

{

unsigned char AckStatus;

SDA_IN;

SCL_HIGH;

i2c_delay(2);

if(P5IN & 0x01)

{

AckStatus = FALSE;

}

else

{

AckStatus = TURE;

}

SCL_LOW;

i2c_delay(2);

SDA_OUT;

return AckStatus;

}

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 06:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表