AMD Xilinx AC701 单板运行IIC EEPROM例程

作者:付汉杰 hankf@amd.com

概述
AMD Xilinx Vitis内部集成了各种外设的例程,为工程师提供了快速上手的代码。

AMD Xilinx有很多开发板。各种单板的硬件参数不一定完全一致,有时需要根据单板硬件设计、Vivado中的Block Design设计,修改外设例程的参数。

IIC EEPROM例程
本文描述在如何运行IIC EEPROM例程。

硬件设计
运行运行IIC EEPROM例程,如果时Zynq-7000/MPSoC, 要在Block Design设计中使能PS的IIC控制器。如果是传统FPGA,要在Block Design设计中添加MicaroBlaze和AXI IIC控制器。然后在Vivado中导出XSA文件,给Vitis后续设计使用。

创建Platform
在Vitis中,先使用Vitis创建Platform。具体步骤是,在Vitis的菜单 “File - New ” 中,选择“Platform Project”, 指定名称如“ac701_multiboot_hw_platform”, 再选择对应的XSA文件和 Processor 如 “micraoblaze_0”,再点击“Finish”。

导入IIC EEPROM例程
1. 打开hw_platform工程。
2. 双击“platform.spr”文件。
3. 双击“micraoblaze_0”的 “board support package”。
4. 等待Drivers窗口显示
5. 点击axi_iic_0行右边的import examples
6. 选择"xiic_eeprom_example"
7. 点击"OK"


之后Vitis会创建一个工程,包含文件xiic_eeprom_example.c。

IIC EEPROM例程更改
下面是在AMD Xilinx AC701 单板运行IIC EEPROM例程所需要的更改。

中断
IIC EEPROM例程使用了中断,需要根据AC701 MicroBlaze硬件工程的设计,修改中断号。

文件xiic_eeprom_example.c中原来使用的中断号是XPAR_INTC_0_IIC_0_VEC_ID,要改成新的中断号。

旧的中断号参数:

#define IIC_INTR_ID XPAR_INTC_0_IIC_0_VEC_ID

在workspace下,能搜索到文件xparameters.h,包含每个设备的中断号。 定义中断号的宏的名称,与Vivado硬件工程的BlockDesign中的IP名称有关,类似如下字符串:

#define XPAR_MICROBLAZE_0_AXI_INTC_AXI_IIC_0_IIC2INTC_IRPT_INTR 2U

因此,新的中断号参数设置为:

#define IIC_INTR_ID XPAR_MICROBLAZE_0_AXI_INTC_AXI_IIC_0_IIC2INTC_IRPT_INTR

IIC MUX
为了节省管脚,AMD Xilinx开发板一般使用一个IIC_MUX(IIC Switch),把一路IIC总线扩展成多路IIC总线。比如AC701使用了PCA9548扩展IIC总线。如果使用了IIC_MUX(IIC Switch), 要定义宏IIC_MUX_ENABLE,并且设置IIC_MUX_ADDRESS、IIC_EEPROM_CHANNEL。定义IIC_MUX_ENABLE后,就使能了函数MuxInit( )。

IIC_MUX_ADDRESS是IIC_MUX在与MPSoC/MicroBlaze之间连接的IIC总线上的地址,需要根据AC701的硬件设计设置。注意,是7位地址,是8位地址的二分之一。根据原理图,AC701 PCA9548的IIC地址是0x74。

IIC_MUX分出多个IIC总线(CHANNEL)。EEPROM所在的IIC总线(CHANNEL)需要根据AC701的硬件设计设置,软件代码中对应的设置是IIC_EEPROM_CHANNEL。AC701上,EEPROM的IIC总线(CHANNEL)是3,IIC_EEPROM_CHANNEL设置成8。这个参数最后在MuxInit( )中被使用。

/*
* The IIC_MUX_ADDRESS defines the address of the IIC MUX device on the
* IIC bus. Note that since the address is only 7 bits, this constant is the
* address divided by 2.
* The IIC Slaves on the KC705/ZC702/ZC706 boards are connected to an
* IIC MUX.
* IIC_EEPROM_CHANNEL is the Channel number of EEPROM for IIC Mux. On KC705 it
* is 0x08 and ZC702 is 0x04.Please refer the User Guide's of the respective
* boards for further information about the Channel number to use EEPROM.
*/
#define IIC_MUX_ADDRESS 0x74
#define IIC_EEPROM_CHANNEL 0x08

/*
* This define should be uncommented if there is IIC MUX on the board to which
* this EEPROM is connected. The boards that have IIC MUX are KC705/ZC702/ZC706.
*/
#define IIC_MUX_ENABLE

EEPROM_ADDRESS
EEPROM_ADDRESS定义EEPROM在IIC总线上的地址。也请注意,是7位地址,是8位地址的二分之一。根据原理图,AC701 EEPROM的IIC地址是0x54。

调试技巧
刚测试时,不熟悉运行流程。建议在函数入口处、返回处多加些打印,了解运行流程。

在判断函数的返回值时,加入下列打印,能快速了解出错的代码和原因。

if (Status != XST_SUCCESS) {
xil_printf("Fail at %s : %d\r\n", __func__, __LINE__ );
return XST_FAILURE;
}

添加打印,成功运行情况的的打印如下:

Begin at XIic_SetAddress : 397
XII_ADDR_TO_SEND_TYPE at XIic_SetAddress : 431
Begin at XIic_SetAddress : 398
XII_ADDR_TO_SEND_TYPE at XIic_SetAddress : 432
SUCCESS at MuxInit : 840
Begin at XIic_SetAddress : 398
XII_ADDR_TO_SEND_TYPE at XIic_SetAddress : 432
Success at IicEepromExample : 465
Successfully ran IIC eeprom Example

本文转载自:博客园

最新文章

最新文章