AMD Xilinx AC701 单板运行IIC EEPROM例程
概述
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例程
-
打开hw_platform工程。
-
双击“platform.spr”文件。
-
双击“micraoblaze_0”的 “board support package”。
-
等待Drivers窗口显示
-
点击axi_iic_0行右边的import examples
-
选择"xiic_eeprom_example"
-
点击"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