FT260学习笔记7-HID2IIC

IIC的2个pin都是开漏输出,所以外部需要接2个上拉电阻。

1. 设置IIC的频率

IIC的频率支持范围为60KHz-3.4MHz,通过setFeature写入参数,其中freq是以KHz为单位的。

buf[0] = 0xa1;
buf[1] = 0x22;
buf[2] = (byte)(freq & 0xff);
buf[3] = (byte)((freq >> 8) & 0xff);

hid.setFeature(buf, 64);

读取设置的频率判断是否设置成功

buf[0] = 0xC0;
hid.getFeature(buf, 64);
int freqSet = 0;
freqSet = (int)buf[2] | (int)buf[3] << 8;
if(freqSet == freq)
{
    Console.WriteLine("Initial frequece OK!");                                                         
    btI2COpen.Text = "Close I2C";
}
else
{
    Console.WriteLine("Setting frequece is " + freqSet);
    Console.WriteLine("I2C Status is " + buf[1]);
}

2. IIC写请求

与UART写类似,只是命令字变成了0xDx

偏移

含义

说明

Byte 0

Report ID

0xD0-0xDE, 根据发送的实际数据长度选择,4字节对齐,0xF0表示4字节数据(小于4字节也选择4字节),0xFE表示60字节数据

Byte 1

SlaveAddr

IIC从地址(7位)

Byte 2

Flag

IIC通信的条件标志:

0x00 – NONE

0x02 – START

0x03 – Repeat Start

0x04 – STOP

0x06 – START_AND_STOP

Byte 3

Length

有效数据的长度

Byte 4 - 63

Data

数据

其中Flag有低3位的组合,例如如果要实现Repeat Start + Stop的数据格式,则Flag选择0x03 | 0x04 = 0x07.   

private bool ft260Write(byte slaveAddr, byte option, byte[] dat, byte len)
{
    byte wrLen = len;
    if (len == 0 && len > hid.OutputReportLength - 4)
        return false;
    byte[] buf = new byte[hid.OutputReportLength];
    buf[0] = 0xD0;
    buf[1] = slaveAddr;
    buf[2] = option;
    buf[3] = (byte)len;
    wrLen = (byte)(wrLen + 4);
    // update report ID
    buf[0] = (byte)(buf[0] + (wrLen >> 2));
    Array.Copy(dat, 0, buf, 4, len);
    return hid.SendBuf(buf);
}

3. IIC读

偏移

含义

说明

Byte 0

Report ID

0xC0

Byte 1

SlaveAddr

IIC从地址(7位)

Byte 2

Flag

IIC通信的条件标志:

0x00 – NONE

0x02 – START

0x03 – Repeat Start

0x04 – STOP

0x06 – START_AND_STOP

Byte 3 - 4

Length

读取数据的长度

   

private bool ft260Read(byte slaveAddr, byte option, UInt32 len)
{
    UInt32 rdLen = len;
    if (len == 0)
        return false;
    byte[] buf = new byte[64];
    buf[0] = 0xC2;
    buf[1] = slaveAddr;
    buf[2] = option;
    buf[3] = (byte)(len & 0x00ff);
    buf[4] = (byte)((len & 0xff00) >> 8);
    if (hid.SendBuf(buf) == false)
        return false;
    return true;
}

4. 写数据到AT24C02

4.1 写入AT24C02的Memory地址,Flag选择0x02,即START

buf[0] = (byte)(addr & 0xff);
ft260Write(slaveAddr, 0x02, buf, 1); //0x02: START

4.2 写入数据,因为每次最多写入60字节,所以只有最后一笔数据需要带STOP。

while(len > 0)
{
    byte count = (byte)((len > (hid.OutputReportLength - 4)) ?
        (byte)(hid.OutputReportLength - 4) : len);

    Array.Copy(dat, offset, buf, 0, count);
    if(count == len)//last
    {
        ft260Write(slaveAddr, 0x04, buf, count); //0x04 : STOP
    }
    else
    {
        ft260Write(slaveAddr, 0x00, buf, count); //0x00 : NONE
    }
    offset += count;
    len -= count;
}

5. 从AT24C02读数据

5.1 写入AT24C02的Memory地址,Flag选择0x02,即START

buf[0] = (byte)(addr & 0xff);
ft260Write(slaveAddr, 0x02, buf, 1); //0x02: START

5.2 写入读请求命令

ft260Read(slaveAddr, 0x03 | 0x04, len);

5.3 同UART读一样,从类Hid的回调函数获取数据

读写AT24C02的结果:

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: pg090-axi-iic是一个AXI-IIC控制器的文档。这个文档描述了AXI-IIC控制器的工作原理、功能、接口和配置,让用户能够更好地理解和使用该控制器。 该控制器是一种用于串行通信的硬件模块,可用于与其他器件进行通信。它支持多种传输方案,包括标准模式、高速模式和快速模式,可适用于多种不同的设计需求。此外,该控制器还支持多个设备地址,可用于同时与多个设备进行通信。 该文档提供了关于AXI-IIC控制器的详细说明,包括物理接口、控制寄存器、中断控制、状态指示灯和时序图等内容。用户可以根据这些说明,轻松地进行控制器的接口设计、配置和调试,实现串行通信的功能。同时,该文档还提供了一些实际应用例子,能更好地展示AXI-IIC控制器的应用场景,帮助用户更好地理解该器件的使用方法和可能的应用领域。 ### 回答2: pg090-axi-iic是一种AXI式I2C总线控制器,它支持AXI4-Lite、AXI4-Stream和AXI4 Memory-Mapped接口。AXI式I2C总线控制器可用于板间通信,也可用于片上模块间通信。它支持I2C Master Mode、Multi-Master Mode和Slave Mode。PG090-AXI-IIC PDF详细介绍了该控制器的寄存器映射、时序图、数据流图等技术细节。控制器的时序参数可以根据使用场景进行调整,例如时钟频率、数据长度、CS保持时间等。控制器的代码使用Verilog编写,用户可以将其合成到FPGA芯片中,进行控制器的实现。用户可以通过AXI接口和该控制器进行通信,从而进行I2C总线控制。该控制器使用方便、功能齐全,适用于各种嵌入式系统和通信应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值