Showing results for 
Show  only  | Search instead for 
Did you mean: 
Registered: ‎05-16-2018

Iicps library, using ZedBoard as a master device



First of all, I am a newbie so I hope I am writing this in the correct pace. 


I am trying to receive data using i2c from the specific register of the slave device with the 7bit address of 0x42 (0b1000010X, where X is R/W bit). As a master device I am using PS side of the ZYNQ on the ZedBoard. I decided to use iicps library from Xilinx SDK.


Generally, in i2c reading is done as fallows:


Write data first:

<I2C slave address><get ACK><register address><get ACK>

Then Read:

<I2C slave address><get ACK><received data><NACK>

blue is done by master and red by slave. 


This is my script: 



#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xiicps.h"


#define IIC_SLAVE_ADDR		(0x84>>1)

#define IIC_SCLK_RATE		100000


XIicPs Iic;		/* Instance of the IIC Device */

u8 SendBuffer[TEST_BUFFER_SIZE];    
u8 RecvBuffer[TEST_BUFFER_SIZE];    

int main()

	XIicPs_Config *Config;

	Config = XIicPs_LookupConfig(IIC_DEVICE_ID);

	XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);

	XIicPs_SetSClk(&Iic, IIC_SCLK_RATE);

	SendBuffer[0] = 0x01;

	XIicPs_MasterSend(&Iic, SendBuffer, 1, IIC_SLAVE_ADDR); /*sending slave and register addresses*/

        int t = 0;

	XIicPs_MasterRecv(&Iic, RecvBuffer, 1, IIC_SLAVE_ADDR); /*sending slave address once again and receiving data*/


	return 0;


This script kind of work. Here are some pictures from oscilloscope which look fine. I also checked sent and received data with the USB Logic Analyzer and everything seams to be correct. 



However there are two problems which I can not solve. 

1) If I decrease or erase delay (while function. delay length 6us) between send and receive function, receive function is not executed. Is this normal?  I thought that delay was not needed at all. 


2) even thought slave returns correct data, XIicPs_MasterRecv function is not storing it inside of RecvBuffer and printf("%d\n",RecvBuffer[0]); always returns 0. 


I am not very experienced in programming, so there is a high possibility that I am not using or understanding  iicps library correctly. This is why I am posting this here.


Thank you to everyone who will read this. I hope I have not occupied much of your time.




0 Kudos
0 Replies