zynq系列之-----PL端iic使用

本文主要讲述zynq的iic使用,iic作为主站使用,作为从站的本文不适合。

Iic的接口在PL端。(iic的接口在ps端的情况下,不适合本文)

如果iic的接口在ps端,请看:xilinx平台中zynq的PS端iic使用_hhh_fpga的博客-CSDN博客_zynq 模拟iic

转载:zynq的PL端iic使用_hhh_fpga的博客-CSDN博客_zynq的iic

使用软件版本:vivado2018.3

先说下PL端的设置吧:

然后设置地址啥的,就不多说了。

开始zynq端的编程了:

貌似不需要初始化的,我的没有经过初始化就可以使用的,可能是因为只当作主站的原因吧。

接下来就是写函数

unsigned iic_write(unsigned char iic_base,unsigned char Address, unsigned char *BufferPtr, int ByteCount)
{
    volatile unsigned SentByteCount;
    volatile unsigned AckByteCount;
    u8 WriteBuffer[sizeof(Address) + 16];
    int Index;
    u32 CntlReg;
    char IicAddr;  
    for (Index = 0; Index < ByteCount; Index++) {
        WriteBuffer[sizeof(Address) + Index] = BufferPtr[Index];
    }   
    SentByteCount = XIic_Send(IIC_BASE_ADDRESS, IicAddr,
                  WriteBuffer, sizeof(Address) + ByteCount,
                  XIIC_STOP);   
    return SentByteCount - sizeof(Address);
}

说明下函数的内容:

iic_base:iic的地址,这个可以看原理图,就知道iic的地址

Address:准备写iic的寄存器地址

*BufferPtr:写iic的数据内容

ByteCount:写iic的数据长度

IIC_BASE_ADDRESS:就是这个iic的地址,这个可以从#include "xparameters.h"里面看到。

然后就是读函数了:

unsigned iic_read(unsigned char iic_base,unsigned char Address, unsigned char *BufferPtr, int ByteCount)
{
    volatile unsigned ReceivedByteCount;
    u16 StatusReg;
    u32 CntlReg;
    do {
        StatusReg = XIic_ReadReg(IIC_BASE_ADDRESS, XIIC_SR_REG_OFFSET);
        if(!(StatusReg & XIIC_SR_BUS_BUSY_MASK)) {
            ReceivedByteCount = XIic_Send(IIC_BASE_ADDRESS,
                    iic_base,
                            (u8 *)&Address,
                            sizeof(Address),
                            XIIC_STOP);

            if (ReceivedByteCount != sizeof(Address)) {


                CntlReg = XIic_ReadReg(IIC_BASE_ADDRESS,
                            XIIC_CR_REG_OFFSET);
                XIic_WriteReg(IIC0_BASE_ADDRESS, XIIC_CR_REG_OFFSET,
                        CntlReg | XIIC_CR_TX_FIFO_RESET_MASK);
                XIic_WriteReg(IIC0_BASE_ADDRESS,
                        XIIC_CR_REG_OFFSET,
                        XIIC_CR_ENABLE_DEVICE_MASK);
            }
        }

    } while (ReceivedByteCount != sizeof(Address));/* Send is aborted so reset Tx FIFO */


    ReceivedByteCount = XIic_Recv(IIC_BASE_ADDRESS, iic_base,
                    BufferPtr, ByteCount, XIIC_STOP);
    return ReceivedByteCount;
}
说明下函数的内容:

iic_base:iic的地址,这个可以看原理图,就知道iic的地址

Address:准备读iic的寄存器地址

*BufferPtr:读到iic的数据内容。

ByteCount:读iic的数据长度

以上就是pl端iic的使用了,这样就可以愉快的使用了。嘻嘻嘻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值