wolfdong7 发表于 2012-1-11 20:00:21

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

目前已解决   主机发数据给从机,从机通过中断接收主机数据,然后立马回写到主机。

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

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

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

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

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

wolfdong7 发表于 2012-1-11 20:02:36

主从机都是atmega16

NJ8888 发表于 2012-1-11 20:09:48

IIC通讯只能由主机发起并控制

wolfdong7 发表于 2012-1-11 20:14:51

回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------

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

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

wolfdong7 发表于 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;
}
}

jnmcu 发表于 2012-1-12 20:55:41

方法1: 多主方式,1#可给2#发写命令;2#可给1#发写命令。()
方法2:主从方式,1#读2#(1#主 2#从)。

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

Zhhu218 发表于 2012-6-26 15:18:38

还是没有搞清楚IIC到底能不能从从机发送数据到主机上,还有多主模式是如何工作的?

dhw5qq 发表于 2014-6-16 08:23:37

wolfdong7 发表于 2012-1-11 20:21
回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------



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

wolfdong7 发表于 2014-6-18 08:44:25

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

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

dhw5qq 发表于 2014-6-24 22:03:14

wolfdong7 发表于 2014-6-18 08:44
哈哈。多长历史了。早忘记了!

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

在一个大系统当中iic通讯是必须要越短越好,但是我按照你的程序,发现好像是80ms的样子,我用stm8试过了,stm8硬件iic简单一点,所以我就想问下你!
该怎么样才能保证iic通讯时间短!
页: [1]
查看完整版本: 求助:纠结了一周了,AVR_IIC从机如何主动发数据给主机。