|
楼主 |
发表于 2005-7-26 14:29:02
|
显示全部楼层
Delphi串口通信编程
作者: 黄军 熊勇 刘燕 刘晓梅
人民邮电出版社
IC总线应用系统设计
【作者】 何立民
出版社】 北京航空航天大学出版社
DELPHI串口通信工程开发实例导航
作者: 求是科技 崔建华 刘瑞军
出版社: 人民邮电出版社
出版日期:2003-08-01
DELPHI串口通信技术与工程实践
作者: 求是科技 赵兰涛 苏彦华
出版社: 人民邮电出版社 ISBN:7-115-12313-6
出版日期:2004-06-01
Delphi与RS-232串行通信控制
作 者 范逸之 陈立元
出 版 社 清华大学出版社
定价 49元
我用avr的IO口来模拟I2C,是不是一定要不断地改变输入输出方向啊(DDRx)
因为现在内部的TWI被占用了,而又要去访问一个带I2C的从器件(DS1302)
所以只能用模拟的,,在仿真的过程中,发现在如果没有改变DDRx的方向则运行不能正常,
如果加上改变输入输出方向,就正常了,
令我不解的是:在读取从机的响应时,我是通过读PINx的,
不是说,不管方向寄存器为何值(0,或 1),都可以读取外部引脚的实际电平吗???
????,即然无关还为什么要加,不加又不行,这到底是为什么?????道理何在,作何解释?
还有一个一小问题:我就是不PINx复位时的值,为N/A,它是什么意思????
如图:
非常感谢马老师的解答,真彻底地说明了,
内部电平会影响到外部引脚上的电平!!!!!
使有硬件的TWI我也想啊,不过它只有一个,而我要用两个的I2C,
一个是用来做跟上位机通讯(本单片机作为从机),上位机是电脑通过一个转换器(uart=>I2C)
送给单片机的,而本身作为从机的单片机(atmega48)又要作为主机来送数给带I2C接口的DAC6574(TI公司的)来实现,DA转换,所以得模拟一个I2C,
对了,我现在用硬件TWI通讯时会出现这样的情况:请分析一下
现像:如果主机(其实就是那个转换器uart转I2C)先通电,然后从机(atmega48)再通电通讯则正常,
反过来,说不行了通讯不了,
(在主机还没有通电时量M48的SDA,SCL的电平为0V,主机通电时量它们的电平为1.5V)
这时主机就再也找不到从机了,,,,
如果从机再断电,通电(相当从机后通电),就又可以正常通讯了(
程序如下:
//常用TWI操作(从模式写和从模式读)
#define Test_Ack() (TWSR & 0x08)
#define Twi_ACK() (TWCR=(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE))
#define Twi_NoACK() (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE))
#define Twi_Stop() (TWCR=(1<<TWSTO)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE))
#define Twi_Write_Byte(x) {TWDR=(x); TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);}
//TWI传输状态
#define TWI_MEM_ADR 0x5A
#define TWI_MEM_DATA 0xA5
#define TWI_NONE 0
unsigned char Twi_State;
unsigned char Mem_Data, Mem_Adr, Mem_Write_Flag;
//---------------------------------------------------------------
#define TRUE 1
#define FALSE 0
#pragma interrupt_handler twi_isr:25
void twi_isr(void)
{ unsigned char status, dat;
status = TWSR & 0xF8;
switch(status)
{
//-------------- I2C 写相关:0x60, 0x80, 0xA0 -------------------
case 0x60: Twi_State = TWI_MEM_ADR;
Twi_ACK();
break;
case 0x80: if(Twi_State == TWI_MEM_ADR)
{ Mem_Adr = TWDR;
Twi_State = TWI_MEM_DATA;
}
else if(Twi_State == TWI_MEM_DATA)
{ Mem_Data = TWDR;
Mem_Write_Flag = TRUE;
Twi_State = TWI_NONE;
}
Twi_ACK();
break;
case 0xA0: Twi_State = TWI_NONE;
Twi_ACK();
break;
// ----------- I2C 读相关 0xA8, 0xC0 ---------------
case 0xA8: Twi_Write_Byte( Ram_Buf[Mem_Adr] );
Twi_ACK();
break;
case 0xC0: Twi_ACK();
break;
default: Twi_State = TWI_NONE;
Twi_Stop();
break;
}
} |
|