搜索
bottom↓
回复: 9

求助:纠结了一周了,AVR_IIC从机如何主动发数据给主机。

[复制链接]

出0入0汤圆

发表于 2012-1-11 20:00:21 | 显示全部楼层 |阅读模式
目前已解决   主机发数据给从机,从机通过中断接收主机数据,然后立马回写到主机。

问题:
但是我需要从机接收到数据以后,还需要将数据进行部分修改,然后再回发给主机。

而中断直接就发了,而我数据进行处理,又好复杂的,感觉放在中断里处理不妥。

所以我需要一个像主机一样那么方便发数据给从机一样。

现在对主机和从机感念和IIC通信方式不是很懂,请大神指导下,谢谢了!

下面附我的代码,其实也是再论坛里找到了,里面有proteus7.8仿真。
点击此处下载 ourdev_712385OYR63R.rar(文件大小:123K) (原文件名:first_program_iic.rar)

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

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

出0入0汤圆

 楼主| 发表于 2012-1-11 20:02:36 | 显示全部楼层
主从机都是atmega16

出0入0汤圆

发表于 2012-1-11 20:09:48 | 显示全部楼层
IIC通讯只能由主机发起并控制

出0入0汤圆

 楼主| 发表于 2012-1-11 20:14:51 | 显示全部楼层
回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------

那么说IIC从机不能发数据给主机了。

SPI双机通信,从机可以发数据给主机吗?

出0入0汤圆

 楼主| 发表于 2012-1-11 20:21:24 | 显示全部楼层
回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------

但是我上面的那个程序,就可以从机给主机通信呀。

主机发一个0X48,中断接收,然后发送一个0X10给主机。

void twi_isr(void)
{
//twi event
switch (TWSR&0xF8)
{
//从接收
   case TW_SR_SLA_ACK:
   case TW_SR_ARB_LOST_SLA_ACK:
   case TW_SR_GCALL_ACK:
   case TW_SR_ARB_LOST_GCALL_ACK:
          Twi_Ack();  //返回ACK
          break;
   case TW_SR_DATA_ACK:
   case TW_SR_DATA_NACK:
          main_tmp = TWDR;
          printf("main_tmp = %x\r\n",main_tmp);           
          Twi_Ack();  //返回ACK
          break;
   case TW_SR_GCALL_DATA_ACK:
   case TW_SR_GCALL_DATA_NACK:       
          Twi_Ack();  //返回ACK
          break;
   case TW_SR_STOP:
          Twi_Ack();
          break;
//从发送*****************************

   case TW_ST_SLA_ACK:               // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
   case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
      // 被选中为从读出 (数据将从传回主机)
          TWDR=0x10;  //发送全局变量中值
          Twi_Ack();                
          break;   
  case TW_ST_DATA_ACK:            // 0xB8: TWDR 里数据已经发送,接收到ACK
      //发送数据位
         TWDR=0x10;
     break;   
   case TW_ST_DATA_NACK:            // 0xC0: TWDR 里数据已经发送接收到NOT ACK
   case TW_ST_LAST_DATA:            // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
      // 全部完成
      // 从方式开放
      Twi_NoAcK();
          twi_slave_init(0x50);        //重新回到初始化状态,等待接收模式的到来
      break;
   case TW_NO_INFO:                 // 0xF8: 没有相关的状态信息;TWINT = “0”
      // 无操作
          break;
   case TW_BUS_ERROR:               // 0x00: 由于非法的START 或STOP 引起的总线错误
      // 内部硬件复位,释放总线
      TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWSTO)|(1<<TWEA);
     break;  
         default:
         break;
}
}

出0入0汤圆

发表于 2012-1-12 20:55:41 | 显示全部楼层
方法1: 多主方式,1#可给2#发写命令;2#可给1#发写命令  。()
方法2:主从方式,1#读2#(1#主 2#从)。

流程细节 mega16的TWI有详细框图

出0入0汤圆

发表于 2012-6-26 15:18:38 | 显示全部楼层
还是没有搞清楚IIC到底能不能从从机发送数据到主机上,还有多主模式是如何工作的?

出0入0汤圆

发表于 2014-6-16 08:23:37 | 显示全部楼层
wolfdong7 发表于 2012-1-11 20:21
回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------

你好,请问你这个中断程序里面执行多长时间,我测试的额是0.3s。有什么办法减小时间吗?

出0入0汤圆

 楼主| 发表于 2014-6-18 08:44:25 | 显示全部楼层
dhw5qq 发表于 2014-6-16 08:23
你好,请问你这个中断程序里面执行多长时间,我测试的额是0.3s。有什么办法减小时间吗? ...

哈哈。多长历史了。早忘记了!

出0入0汤圆

发表于 2014-6-24 22:03:14 | 显示全部楼层
wolfdong7 发表于 2014-6-18 08:44
哈哈。多长历史了。早忘记了!

是这样的,我现在有个锂电池BMS系统要做,就是采集一个BQ锂电池管理芯片的电流数据,因为要保证中断里面接收数据和发数据在1ms完成,所以我现在不知道怎么在你的程序基础上将时间尽量减少。

在一个大系统当中iic通讯是必须要越短越好,但是我按照你的程序,发现好像是80ms的样子,我用stm8试过了,stm8硬件iic简单一点,所以我就想问下你!
该怎么样才能保证iic通讯时间短!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 22:49

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

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