求助:纠结了一周了,AVR_IIC从机如何主动发数据给主机。
目前已解决 主机发数据给从机,从机通过中断接收主机数据,然后立马回写到主机。问题:
但是我需要从机接收到数据以后,还需要将数据进行部分修改,然后再回发给主机。
而中断直接就发了,而我数据进行处理,又好复杂的,感觉放在中断里处理不妥。
所以我需要一个像主机一样那么方便发数据给从机一样。
现在对主机和从机感念和IIC通信方式不是很懂,请大神指导下,谢谢了!
下面附我的代码,其实也是再论坛里找到了,里面有proteus7.8仿真。
点击此处下载 ourdev_712385OYR63R.rar(文件大小:123K) (原文件名:first_program_iic.rar) 主从机都是atmega16 IIC通讯只能由主机发起并控制 回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------
那么说IIC从机不能发数据给主机了。
SPI双机通信,从机可以发数据给主机吗? 回复【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;
}
} 方法1: 多主方式,1#可给2#发写命令;2#可给1#发写命令。()
方法2:主从方式,1#读2#(1#主 2#从)。
流程细节 mega16的TWI有详细框图 还是没有搞清楚IIC到底能不能从从机发送数据到主机上,还有多主模式是如何工作的? wolfdong7 发表于 2012-1-11 20:21
回复【2楼】NJ8888 NJ8888
-----------------------------------------------------------------------
你好,请问你这个中断程序里面执行多长时间,我测试的额是0.3s。有什么办法减小时间吗? dhw5qq 发表于 2014-6-16 08:23
你好,请问你这个中断程序里面执行多长时间,我测试的额是0.3s。有什么办法减小时间吗? ...
哈哈。多长历史了。早忘记了! wolfdong7 发表于 2014-6-18 08:44
哈哈。多长历史了。早忘记了!
是这样的,我现在有个锂电池BMS系统要做,就是采集一个BQ锂电池管理芯片的电流数据,因为要保证中断里面接收数据和发数据在1ms完成,所以我现在不知道怎么在你的程序基础上将时间尽量减少。
在一个大系统当中iic通讯是必须要越短越好,但是我按照你的程序,发现好像是80ms的样子,我用stm8试过了,stm8硬件iic简单一点,所以我就想问下你!
该怎么样才能保证iic通讯时间短!
页:
[1]