概述
AMD Xilinx Vitis内部集成了各种外设的例程,为工程师提供了快速上手的代码。
AMD Xilinx有很多开发板。各种单板的硬件参数不一定完全一致,有时需要根据单板硬件设计、Vivado中的Block Design设计,修改外设例程的参数。
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;
}
xil_printf("SUCCESS at %s : %d\r\n", __func__, __LINE__ );
添加打印,成功运行情况的的打印如下:
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
标签:__,例程,AC701,MUX,AMD,CHANNEL,IIC,EEPROM
From: https://www.cnblogs.com/hankfu/p/17390868.html