![]() |
iic
Vitis Drivers API Documentation
|
This file consists of a Interrupt mode design example which uses the Xilinx IIC device and XIic driver to exercise the EEPROM in Dynamic controller mode.
The XIic driver uses the complete FIFO functionality to transmit/receive data.
This example writes/reads from the lower 256 bytes of the IIC EEPROMS. Please refer to the datasheets of the IIC EEPROM's for details about the internal addressing and page size of these devices.
The XIic_DynMasterSend() API is used to transmit the data and XIic_DynMasterRecv() API is used to receive the data.
This example is tested on ML300/ML310/ML403/ML501/ML507/ML510/ML605/SP601 and SP605 Xilinx boards.
The ML310/ML410/ML510/SCU35 boards have a on-board 64 Kb serial IIC EEPROM (Microchip 24LC64A). The WP pin of the IIC EEPROM is hardwired to ground on this board.
The ML300 board has an on-board 32 Kb serial IIC EEPROM(Microchip 24LC32A). The WP pin of the IIC EEPROM has to be connected to ground for this example. The WP is connected to pin Y3 of the FPGA.
The ML403 board has an on-board 4 Kb serial IIC EEPROM(Microchip 24LC04A). The WP pin of the IIC EEPROM is hardwired to ground on this board.
The ML501/ML505/ML507/ML605/SP601/SP605 boards have an on-board 8 Kb serial IIC EEPROM(STM M24C08). The WP pin of the IIC EEPROM is hardwired to ground on these boards.
The AddressType for ML300/ML310/ML410/ML510/SCU200/SCU35 boards should be u16 as the address pointer in the on board EEPROM is 2 bytes.
The AddressType for ML403/ML501/ML505/ML507/ML605/SP601/SP605 boards should be u8 as the address pointer for the on board EEPROM is 1 byte.
The 7 bit IIC Slave address of the IIC EEPROM on the ML300/ML310/ML403/ML410/ ML501/ML505/ML507/ML510/SCU200 boards is 0x50. The 7 bit IIC Slave address of the IIC EEPROM on the ML605/SP601/SP605 boards is 0x54. Refer to the User Guide's of the respective boards for further information about the IIC slave address of IIC EEPROM's.
The define EEPROM_ADDRESS in this file needs to be changed depending on the board on which this example is to be run.
This code assumes that no Operating System is being used.
None.
MODIFICATION HISTORY:
Ver Who Date Changes
1.00a mta 04/13/06 Created. 2.00a ktn 11/17/09 Updated to use the HAL APIs. 2.01a ktn 03/17/10 Updated the information about the EEPROM's used on ML605/SP601/SP605 boards. Updated the example so that it can be used to access the entire IIC EEPROM for devices like M24C04/M24C08 that use LSB bits of the IIC device select code (IIC slave address) to specify the higher address bits of the EEPROM internal address. 3.4 ms 01/23/17 Added xil_printf statement in main function to ensure that "Successfully ran" and "Failed" strings are available in all examples. This is a fix for CR-965028. 3.10 gm 07/09/23 Added SDT support 3.15 vlt 02/11/26 Updated comment lines for SCU200 and SCU35 EEPROM address, page size, and address type used for testing.
#include "xparameters.h"#include "xiic.h"#include "xil_sutil.h"#include "xil_exception.h"#include "xil_printf.h"#include "xinterrupt_wrap.h"Macros | |
| #define | XIIC_BASEADDRESS XPAR_XIIC_0_BASEADDR |
| The following constants map to the XPAR parameters created in the xparameters.h file. More... | |
| #define | EEPROM_ADDRESS 0x54 /* 0xA0 as an 8 bit number. */ |
| The following constant defines the address of the IIC Slave device on the IIC bus. More... | |
| #define | PAGE_SIZE 16 |
| The page size determines how much data should be written at a time. More... | |
| #define | EEPROM_TEST_START_ADDRESS 128 |
| The Starting address in the IIC EEPROM on which this test is performed. More... | |
| #define | MAX_DELAY_CNT 10000 |
| Maximum delay count used for timeout handling. More... | |
| #define | EventMask 0xFF |
| Internal IIC event mask. More... | |
| #define | Event_Value 0 |
| Internal event value used for IIC event checking. More... | |
Typedefs | |
| typedef u8 | AddressType |
| The AddressType for ML300/ML310/ML410/ML510/SCU200/SCU35 boards should be u16 as the address pointer in the on board EEPROM is 2 bytes. More... | |
Functions | |
| int | IicDynEepromExample (void) |
| This function writes, reads, and verifies the data to the IIC EEPROM in Dynamic controller mode. More... | |
| int | DynEepromWriteData (u16 ByteCount) |
| This function writes a buffer of data to the IIC serial EEPROM. More... | |
| int | DynEepromReadData (u8 *BufferPtr, u16 ByteCount) |
| This function reads data from the IIC serial EEPROM into a specified buffer. More... | |
| int | main (void) |
| Variable for storing Eeprom IIC address. More... | |
Variables | |
| u8 | WriteBuffer [sizeof(AddressType)+PAGE_SIZE] |
| The instance of the IIC device. More... | |
| volatile u8 | TransmitComplete |
| Read buffer for reading a page. More... | |
| volatile u8 | ReceiveComplete |
| Flag to check completion of Transmission. More... | |
| u8 | EepromIicAddr |
| Flag to check completion of Reception. More... | |
| #define EEPROM_ADDRESS 0x54 /* 0xA0 as an 8 bit number. */ |
The following constant defines the address of the IIC Slave device on the IIC bus.
Note that since the address is only 7 bits, this constant is the address divided by 2. The 7 bit IIC Slave address of the IIC EEPROM on the ML300/ML310/ML403/ML510/ ML501/ML505/ML507/ML510/SCU200 boards is 0x50. The 7 bit IIC Slave address of the IIC EEPROM on the ML605/SP601/SP605 boards is 0x54. Please refer the User Guide's of the respective boards for further information about the IIC slave address of IIC EEPROM's.
Referenced by IicDynEepromExample().
| #define EEPROM_TEST_START_ADDRESS 128 |
The Starting address in the IIC EEPROM on which this test is performed.
Referenced by DynEepromReadData(), and IicDynEepromExample().
| #define Event_Value 0 |
Internal event value used for IIC event checking.
Referenced by DynEepromReadData().
| #define EventMask 0xFF |
Internal IIC event mask.
Referenced by DynEepromReadData().
| #define MAX_DELAY_CNT 10000 |
Maximum delay count used for timeout handling.
Referenced by DynEepromReadData(), and DynEepromWriteData().
| #define PAGE_SIZE 16 |
The page size determines how much data should be written at a time.
The ML310/ML300/SCU200/SCU35 board supports a page size of 32 and 16. The write function should be called with this as a maximum byte count.
Referenced by IicDynEepromExample().
| #define XIIC_BASEADDRESS XPAR_XIIC_0_BASEADDR |
The following constants map to the XPAR parameters created in the xparameters.h file.
They are defined here such that a user can easily change all the needed parameters in one place.
Referenced by IicDynEepromExample(), and main().
| typedef u8 AddressType |
The AddressType for ML300/ML310/ML410/ML510/SCU200/SCU35 boards should be u16 as the address pointer in the on board EEPROM is 2 bytes.
The AddressType for ML403/ML501/ML505/ML507/ML605/SP601/SP605 boards should be u8 as the address pointer in the on board EEPROM is 1 bytes.
| int DynEepromReadData | ( | u8 * | BufferPtr, |
| u16 | ByteCount | ||
| ) |
This function reads data from the IIC serial EEPROM into a specified buffer.
| BufferPtr | contains the address of the data buffer to be filled. |
| ByteCount | contains the number of bytes in the buffer to be read. |
References DynEepromWriteData(), EEPROM_TEST_START_ADDRESS, Event_Value, EventMask, MAX_DELAY_CNT, ReceiveComplete, XIic_DynMasterRecv(), XIic_Start(), and XIic_Stop().
Referenced by IicDynEepromExample().
| int DynEepromWriteData | ( | u16 | ByteCount | ) |
This function writes a buffer of data to the IIC serial EEPROM.
| ByteCount | contains the number of bytes in the buffer to be written. |
References MAX_DELAY_CNT, XIic::Stats, TransmitComplete, XIicStats::TxErrors, WriteBuffer, XIic_DynMasterSend(), XIic_MasterSend(), XIic_Start(), and XIic_Stop().
Referenced by DynEepromReadData(), and IicDynEepromExample().
| int IicDynEepromExample | ( | void | ) |
This function writes, reads, and verifies the data to the IIC EEPROM in Dynamic controller mode.
It does the write as a single page write, performs a buffered read.
Pointer to configuration data
References XIic_Config::BaseAddress, DynEepromReadData(), DynEepromWriteData(), EEPROM_ADDRESS, EEPROM_TEST_START_ADDRESS, EepromIicAddr, XIic_Config::IntrId, XIic_Config::IntrParent, PAGE_SIZE, WriteBuffer, XII_ADDR_TO_SEND_TYPE, XIIC_BASEADDRESS, XIic_CfgInitialize(), XIic_InterruptHandler(), XIic_LookupConfig(), XIic_SetAddress(), XIic_SetRecvHandler(), XIic_SetSendHandler(), and XIic_SetStatusHandler().
Referenced by main().
| int main | ( | void | ) |
Variable for storing Eeprom IIC address.
Main function to call the Dynamic EEPROM example.
References IicDynEepromExample().
| u8 EepromIicAddr |
Flag to check completion of Reception.
Referenced by EepromReadByte(), EepromWriteByte(), IicDynEepromExample(), IicEepromExample(), IicLowLevelDynEeprom(), and IicLowLevelEeprom().
| volatile u8 ReceiveComplete |
Flag to check completion of Transmission.
Referenced by DynEepromReadData(), EepromReadData(), SlaveReadData(), and TenBitAddrReadData().
| volatile u8 TransmitComplete |
Read buffer for reading a page.
Referenced by DynEepromWriteData(), EepromWriteData(), IicMultiMasterExample(), SlaveWriteData(), and TenBitAddrWriteData().
| u8 WriteBuffer[sizeof(AddressType)+PAGE_SIZE] |
The instance of the IIC device.
Write buffer for writing a page.
Referenced by DynEepromWriteData(), EepromReadData(), EepromWriteByte(), EepromWriteData(), IicDynEepromExample(), IicEepromExample(), IicLowLevelDynEeprom(), IicMultiMasterExample(), IicRepeatedStartExample(), IicSlaveExample(), IicTenBitAddrExample(), ReadWriteVerify(), SlaveWriteData(), and TenBitAddrWriteData().