200----分,求AT24C512写入方法.--解决了,新开帖再给分

haoya 2005-08-05 01:38:11
我是一个初学者,想制作一个读写AT24C512的电路,和程序。
我采用VB+ DLPORTIO 开发读写程序。
资料借鉴的I2C协议规范 + ATC512的文档
和网上找的一篇帖子。
计算机并口模拟I2C总线的试验<http://www.rs232.net.cn/technic/tech-20.htm>(实验电路,就是用的那个)
但是由于,懂的不多,呵呵,没有成功,而且做出来的软件,在接受应答信号时根本没有错误提示。即使并口没有接入设备,软件写部分都能够正常运行。
所以,望高手,提供一个详细的方案,以及在编程中的注意事项。

小弟将不胜感激!!
...全文
418 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_guang_wu 2005-08-08
  • 打赏
  • 举报
回复
Dim t, i As Long
Dim FileNumber
Public Da(0 to 65535) as Byte

FileNumber = FreeFile(0)
Open "a.bin" For Binary Access Read Lock Read As #FileNumber
t = LOF(FileNumber)
If t > 65536 Then t = 65536
For i = 1 To t
Get #FileNumber, i, Da(i - 1)
Next i
Close #FileNumber
haoya 2005-08-07
  • 打赏
  • 举报
回复
这个是写入数据的主程序m_cFileRead是一个2进制块读出类。

Dim nActual As Long
Dim lpBuf As Long
Dim e As Long, m As Integer, s As Variant, i As Integer, o As Integer
CommonDialog1.ShowOpen
Text1 = CommonDialog1.FileName
lpBuf = VarPtr(aBuf(0))
ProgressBar1.Min = 1
ProgressBar1.Max = 128 * 4
ProgressBar1.Value = 1
If Not m_cFileRead.OpenBinary(Text1.Text) Then MsgBox "打开文件失败!" & Text1.Text
Do
nActual = m_cFileRead.ReadBlock(lpBuf, BUFFER_SIZE)
For i = 1 To 128
I2cStart
WriteByte Asc(160)
WriteByte Asc((e And 65280) \ 255)
WriteByte Asc(e And 255)
For m = 1 To 128
s = WriteByte(aBuf(m * i - 1))
If s <> 0 Then
Label1 = s
GoTo myerror
End If
Next m
e = e + 128
ProgressBar1.Value = i + o * 128
Sleep 1
Next i
o = o + 1
Loop Until nActual < BUFFER_SIZE '当实际读取字节数小于缓冲区大小的时候,就不需要再读啦,已读完啦
Label1 = "写完成"
myerror:
m_cFileRead.CloseFile
haoya 2005-08-07
  • 打赏
  • 举报
回复
DLPORT IO 驱动能够在WINDOWS下正常运行,用端口读写软件+万用表测过电压,均正常。
我在每一个端口操作语句间都加入了一个延时函数,采用的FOR循环延时。
页写模式的页延时用API SLEEP延时。
Sub Sleep(ByVal thistime As Integer)
Dim i As Integer
For i = 1 To thistime
Next i
End Sub
Sub I2cStart()
'I2c开始指令
DlPortWritePortUchar &H378, &HFF
Sleep DelayTime
DlPortWritePortUchar &H378, &HFD
Sleep DelayTime
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
End Sub
Sub CalcBinary(ByVal s As Byte)
Dim i As Integer, m As Integer
i = Val(s)
For m = 7 To 0 Step -1
ByteBit(m) = i Mod 2
i = i \ 2
Next m
End Sub
Sub I2cStop()
'I2c停止指令
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
DlPortWritePortUchar &H378, &HFD
Sleep DelayTime
DlPortWritePortUchar &H378, &HFF
Sleep DelayTime
DlPortWritePortUchar &H378, &HFE
Sleep DelayTime
End Sub
Sub MainAsk()
'主机发送应答信息
Sleep DelayTime
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
DlPortWritePortUchar &H378, &HFD
Sleep DelayTime
DlPortWritePortUchar &H378, &HFC
End Sub
Function WriteByte(ByVal s As Byte) As Variant
Dim i As Integer, e As Byte
CalcBinary s
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
For i = 0 To 7
If (ByteBit(i)) = 1 Then
DlPortWritePortUchar &H378, &HFE
Sleep DelayTime
DlPortWritePortUchar &H378, &HFF
Else
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
DlPortWritePortUchar &H378, &HFD
End If
Next i
'接受应答
Sleep DelayTime
DlPortWritePortUchar &H378, &HFE
Sleep DelayTime
DlPortWritePortUchar &H378, &HFF
Sleep DelayTime
DlPortWritePortUchar &H378, &HFC
Sleep DelayTime
e = DlPortReadPortUchar(&H379)
CalcBinary e
If ByteBit(3) = 0 Then '第4位
WriteByte = 0
Exit Function
Else
WriteByte = "写错误,无应答!"
End If
End Function
Function ReadByte() As Byte
Dim i As Integer, e As Byte, m As Integer
For i = 0 To 7
Sleep DelayTime
DlPortWritePortUchar &H378, &HFE
Sleep DelayTime
DlPortWritePortUchar &H378, &HFF
Sleep DelayTime
e = DlPortReadPortUchar(&H379)
CalcBinary e
m = m + ByteBit(3) * (2 ^ (7 - i))
DlPortWritePortUchar &H378, &HFE
Sleep DelayTime
Next i
ReadByte = Char(m)
End Function
haoya 2005-08-07
  • 打赏
  • 举报
回复
!!!
flowercity 2005-08-06
  • 打赏
  • 举报
回复
#define PAGE_SIZE 8

sbit sda_rom=P1^3;
sbit clk_rom=P1^2;

void Set_Sda(bit sw)
{
sda_rom=sw;
}

void Set_Scl(bit sw)
{
clk_rom=sw;
}

void Set_Start_Condition()
{
Set_Scl(0);
Set_Sda(1);
Set_Scl(1);
Set_Sda(0);
}

void Set_Stop_Condition()
{
Set_Scl(0);
Set_Sda(0);
Set_Scl(1);
Set_Sda(1);
}

void Send_Byte_Memory(uchar value)
{
uchar i,shift;
shift=0x80;
for(i=0;i<8;i++)
{
Set_Scl(0);
if(value&shift)
{
Set_Sda(1);
}
else
{
Set_Sda(0);
}
shift>>=1;
Set_Scl(1);
}
Set_Scl(0);
Set_Sda(1);
Set_Scl(1);
}

uchar Revice_Byte_Memory()
{
uchar i,value=0;
for(i=0;i<8;i++)
{
value<<=1;
Set_Scl(1);
if(sda_rom) value|=1;
Set_Scl(0);
}
return value;
}

bit Write_Device(uint addr)
{
uchar i,k;
i=(addr>>8)&0xff;
i<<=1;
i|=0xa0;

for(k=0;k<100;k++)
{
Set_Sda(0);
Send_Byte_Memory(i);
if(!sda_rom) goto ack_ok;
}
return 1;
ack_ok:
i=addr&0xff;
Send_Byte_Memory(i);
return 0;
}

//return =0 fail
// =1 success
bit ReadEeprom(uchar *s,int addr,int len)
{
int i;
if(Write_Device(addr)) return 0;

Set_Start_Condition();
Send_Byte_Memory(0XA1);
Set_Scl(0);
Set_Sda(1);
s[0]=Revice_Byte_Memory();
for(i=1;i<len;i++)
{
Set_Sda(0);
Set_Scl(1);
Set_Scl(0);
Set_Sda(1);
s[i]=Revice_Byte_Memory();
}

Set_Sda(1);
Set_Scl(1);
Set_Stop_Condition();
return 1;
}

//return =1 success
// =0 fail
bit WriteEeprom(uchar *s, int addr,int len)
{
uchar temp;

start_label:
if(Write_Device(addr)) return 0;
while(len>0)
{
len--;
Send_Byte_Memory(*s);
temp=addr&PAGE_SIZE;
addr++;
s++;
if(temp==PAGE_SIZE)
{
Set_Stop_Condition();
goto start_label;
}
}
Set_Stop_Condition();
return 1;
}


FIFO2003 2005-08-05
  • 打赏
  • 举报
回复
你在pure dos下看看可否成功! 我认为在windows下 + 你那个端口驱动可能会有问题 或者你用porttalk试一下
ppcust 2005-08-05
  • 打赏
  • 举报
回复
不如在下面加个51单片机 。。。这样控制就方便了。。

pc上api对硬件操作很麻烦。时序不好控制
haoya 2005-08-05
  • 打赏
  • 举报
回复
我没有使用API中的sleep延时,我用的for循环,但是,不能收到应答信号,连接是否正常都判断不出来呀。
rzsheng 2005-08-05
  • 打赏
  • 举报
回复
不要着急,看看别人的例子
haoya 2005-08-05
  • 打赏
  • 举报
回复
或者QQ 39893523联系。
急呀。
大虾们,紧急求助!

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧