在不深入了解项目背景的情况下,我们通过使用一些非常有创意的编码,从一些标准文本字段创建了一个 BIN 文件。没有问题 - 它运行良好。然后,我们使用称为 Aardvark 的编程器将此 BIN 文件写入 EEPROM 芯片。它有自己的程序来执行此操作,称为 FlashCenter,但也提供了一个 API。因为编程这个芯片对一些员工来说是一个障碍,我们想把这个功能包含到我们的 BIN 文件生成器中(即 - BIN 文件被生成、存储并立即写入 EEPROM)。
唯一的问题是,就我有限的知识而言,这是非常先进的,并且无法弄清楚如何使用 Aardvark API 提供的 VB 代码将 BIN 文件数据传递到 EEPROM。我希望您不介意我提供一些示例代码,并希望有人可以帮助我解决这个问题。
这是 Aardvark API 中提供的示例 VB 代码: 代码:
'==========================================================================
' (c) 2004-2009 Total Phase, Inc.
'--------------------------------------------------------------------------
' Project : Aardvark Sample Code
' File : aai2c_eeprom.bas
'--------------------------------------------------------------------------
' Perform simple read and write operations to an I2C EEPROM device.
'--------------------------------------------------------------------------
' Redistribution and use of this file in source and binary forms, with
' or without modification, are permitted.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
' FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
' COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
' INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
' BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
' LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
' CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
' LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
' ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
' POSSIBILITY OF SUCH DAMAGE.
'==========================================================================
Imports TotalPhase
Module aai2c_eeprom
'==========================================================================
' CONSTANTS
'==========================================================================
Const I2C_BITRATE As Integer = 100 'kHz
Const I2C_BUS_TIMEOUT As UShort = 150 'ms
Const I2C_DEVICE As UShort = &H54
'==========================================================================
' MAIN PROGRAM
'==========================================================================
Sub aai2c_eeprom_run(ByRef sampletext As Windows.Forms.TextBox)
Dim handle As Long
handle = AardvarkApi.aa_open(0)
If (handle <= 0) Then
sampletext.Text &= "Unable to open Aardvark device on port 0" & vbCrLf
sampletext.Text &= "Error code = " & handle & vbCrLf
Exit Sub
End If
' Ensure that the I2C subsystem is enabled
Call AardvarkApi.aa_configure(handle, AardvarkConfig.AA_CONFIG_SPI_I2C)
' Enable the I2C bus pullup resistors (2.2k resistors).
' This command is only effective on v2.0 hardware or greater.
' The pullup resistors on the v1.02 hardware are enabled by default.
Call AardvarkApi.aa_i2c_pullup(handle, AardvarkApi.AA_I2C_PULLUP_BOTH)
' Power the board using the Aardvark adapter's power supply.
' This command is only effective on v2.0 hardware or greater.
' The power pins on the v1.02 hardware are not enabled by default.
Call AardvarkApi.aa_target_power(handle, AardvarkApi.AA_TARGET_POWER_BOTH)
' Set the bitrate
Dim bitrate As Long
bitrate = AardvarkApi.aa_i2c_bitrate(handle, I2C_BITRATE)
sampletext.Text &= "Bitrate set to " & bitrate & " kHz" & vbCrLf
' Set the bus lock timeout
Dim bus_timeout As Long
bus_timeout = AardvarkApi.aa_i2c_bus_timeout(handle, I2C_BUS_TIMEOUT)
sampletext.Text &= "Bus lock timeout set to " & bus_timeout & " ms" & vbCrLf
' Write the offset and read the data
'Dim offset(15) As Byte
Dim offset() As Byte = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1} 'THIS IS JUST A TEST STRING, but doesn't seem to ever get written
Dim data(128) As Byte
Dim result As Long
Dim k As String = String.Empty
offset(0) = 1
Call AardvarkApi.aa_i2c_write(handle, I2C_DEVICE, AardvarkI2cFlags.AA_I2C_NO_STOP, 128, offset)
result = AardvarkApi.aa_i2c_read(handle, I2C_DEVICE, AardvarkI2cFlags.AA_I2C_NO_FLAGS, 128, data)
If result <= 0 Then
sampletext.Text &= "i2c read error" & vbCrLf
Else
Dim i As Integer
sampletext.Text &= "Read data bytes:"
For i = 0 To 127
k &= System.Convert.ToChar(data(i)).ToString
Next
sampletext.Text &= k
sampletext.Text &= vbCrLf
End If
' Close the device and exit
AardvarkApi.aa_close(handle)
End Sub
End Module
并专门处理“写”功能:
Call AardvarkApi.aa_i2c_write(handle, I2C_DEVICE, AardvarkI2cFlags.AA_I2C_NO_STOP, 128, offset)
...这是支持文档的定义:
主写入 (aa_i2c_write)
int aa_i2c_write (Aardvark aardvark,
aa_u16 slave_addr,
AardvarkI2cFlags flags,
aa_u16 num_bytes,
const aa_u08 * data_out);
将字节流写入 I2C 从设备。参数 aardvark 适配器的 aardvark 句柄 slave_addr 要从中读取的从站标志特殊操作,如“注释”部分所述 num_bytes 要写入的字节数(最大 65535) data_out 指向数据的指针 返回值 写入的字节数。
特定错误代码 AA_I2C_WRITE_ERROR 从 Aardvark 适配器读取确认时出错。这很可能是通信错误的结果。细节 对于普通的 7 位寻址,slave_addr 的低 7 位应该对应从地址。最高位被忽略。Aardvark I2C 子系统将在抓取总线后将地址与 R/W 位一起组装。对于 10 位寻址,addr 的低 10 位应对应从地址。Aardvark 适配器然后将地址组装成飞利浦规范中描述的正确格式。如果使用 10 位寻址模式,则存在一个限制,即在单个事务中最多只能写入 65534 个字节。
slave_addr 0x00 已在 I2C 协议规范中保留用于广播呼叫寻址。启用以响应广播呼叫的 I2C 从机将确认该地址。通用调用在 Aardvark I2C 主控中没有特殊处理。如果需要通用调用的硬件地址编程功能,该 API 的用户可以手动组装第一个数据字节。
实际上可以向从机写入 0 个字节。从机将被寻址,然后 Aardvark 适配器将立即发送停止条件。没有字节被发送到从设备,因此数据参数被忽略(即,它可以是 0 或指向无效内存)。
如果写入的字节数为零,则可能出现以下情况。
未找到请求的从站。请求的从机在总线上,但拒绝确认其地址。由于存在另一个 I2C 主机,Aardvark 适配器无法占用总线。这里,在从机寻址阶段仲裁丢失,结果可能无法预测。从站被寻址并且没有字节被写入,因为 num_bytes 设置为 0。由于以下可能性,写入的字节数可能小于事务中请求的字节数。
由于存在另一个 I2C 主机,Aardvark 适配器在数据传输期间丢失了总线。从机拒绝接收更多字节。
很明显我必须传递一个字节数组,但我不完全确定如何编码 BIN 文件以便它可以传递。在这个低级别有很多转换,我很模糊......将事物转换为字符串,字节或字符等。我已经玩过它们足以知道在某些情况下你最终会得到ASCII,或十六进制等......但我不确定在这种情况下需要什么才能使其工作。
为了使这更简单,我很想将任何东西传递给 EEPROM。无论我在此代码中进行什么更改,我都无法将任何内容写入 EEPROM。或者也许确实如此,而我只是没有看到。当您运行此代码时,“读取”函数会生成输出“12345678910111213141516”。目前有 128 字节的虚拟内容填充 EEPROM,其中没有 1-16。
如果有人能让我走上正确的轨道,将不胜感激!!!!谢谢你。