Jump to content
  • 0

zybo DAC through mcp4725


suung33

Question

Hi.

I would like to ask about how to use mcp4725 on the zybo board.

I want to obtain analog voltage by connecting SDA and SCL signals from MIO14 and 15 of Zybo z7-10 to mcp4725. For this purpose, I wrote the code by referring to 'xiicps_polled_master_example.c', which is an example provided by Xilinx. When I measured the voltage using an oscilloscope, I could see that the Vout of the mcp4725 changed for a while, but I couldn't get the constant value I wanted. How can I control the Vout of the mcp4725? I will attach the code and the photo. Thank you.

ps) Like connecting mcp4725 to Arduino, Can I use the driver provided by adafruit in Vitis?

/////////////////////////////////////////////////////////////////////////////////////////////////

/******************************************************************************

* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved.

* SPDX-License-Identifier: MIT

******************************************************************************/

/*****************************************************************************/

/**

* @file xiicps_polled_master_example.c

*

* A design example of using the device in polled mode as master.

*

* The example uses buffer size 132. Please set the send buffer of the

* Aardvark device to be continuous 64 bytes from 0x00 to 0x3F.

 *

 * <pre> MODIFICATION HISTORY:

 *

 * Ver  Who Date   Changes

 * ----- --- -------- -----------------------------------------------

 * 1.00a jz 01/30/10 First release

 *

 * </pre>

 *

 ****************************************************************************/

/***************************** Include Files **********************************/

#include "xparameters.h"

#include "xiicps.h"

#include "xil_printf.h"

/************************** Constant Definitions ******************************/

/*

 * 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.

 */

#define IIC_DEVICE_ID        XPAR_XIICPS_0_DEVICE_ID

/*

 * The slave address to send to and receive from.

 */

#define IIC_SLAVE_ADDR        0x62 // default address of mcp4725

#define IIC_SCLK_RATE        100000

/*

 * The following constant controls the length of the buffers to be sent

 * and received with the IIC.

 */

//#define TEST_BUFFER_SIZE    132

#define TEST_BUFFER_SIZE    132 // Do I have to change this value??

/**************************** Type Definitions ********************************/

/************************** Function Prototypes *******************************/

int IicPsMasterPolledExample(u16 DeviceId);

/************************** Variable Definitions ******************************/

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

/*

 * The following buffers are used in this example to send and receive data

 * with the IIC.

 */

u8 SendBuffer[TEST_BUFFER_SIZE];  /**< Buffer for Transmitting Data */

u8 RecvBuffer[TEST_BUFFER_SIZE];  /**< Buffer for Receiving Data */

/******************************************************************************/

/**

*

* Main function to call the polled master example.

*

*

* @return    XST_SUCCESS if successful, XST_FAILURE if unsuccessful.

*

* @note        None.

*

*******************************************************************************/

int main(void)

{

    int Status;

    xil_printf("IIC Master Polled Example Test \r\n");

    /*

     * Run the Iic polled example in master mode, specify the Device

     * ID that is specified in xparameters.h.

     */

    Status = IicPsMasterPolledExample(IIC_DEVICE_ID);

    if (Status != XST_SUCCESS) {

        xil_printf("IIC Master Polled Example Test Failed\r\n");

        return XST_FAILURE;

    }

    xil_printf("Successfully ran IIC Master Polled Example Test\r\n");

    return XST_SUCCESS;

}

/*****************************************************************************/

/**

*

* This function sends data and expects to receive data from slave as modular

* of 64.

*

* This function uses interrupt-driven mode of the device.

*

* @param    DeviceId is the Device ID of the IicPs Device and is the

*        XPAR_<IICPS_instance>_DEVICE_ID value from xparameters.h

*

* @return    XST_SUCCESS if successful, otherwise XST_FAILURE.

*

* @note        None.

*

*******************************************************************************/

int IicPsMasterPolledExample(u16 DeviceId)

{

    int Status;

    XIicPs_Config *Config;

    int Index;

    /*

     * Initialize the IIC driver so that it's ready to use

     * Look up the configuration in the config table,

     * then initialize it.

     */

    Config = XIicPs_LookupConfig(DeviceId);

    if (NULL == Config) {

        return XST_FAILURE;

    }

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

    if (Status != XST_SUCCESS) {

        return XST_FAILURE;

    }

    /*

     * Perform a self-test to ensure that the hardware was built correctly.

     */

    Status = XIicPs_SelfTest(&Iic);

    if (Status != XST_SUCCESS) {

        return XST_FAILURE;

    }

    /*

     * Set the IIC serial clock rate.

     */

    XIicPs_SetSClk(&Iic, IIC_SCLK_RATE);

    /*

     * Initialize the send buffer bytes with a pattern to send and the

     * the receive buffer bytes to zero to allow the receive data to be

     * verified.

     */

    for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) {

        SendBuffer[Index] = (Index % TEST_BUFFER_SIZE);

        RecvBuffer[Index] = 0;

    }

    /*

     * Send the buffer using the IIC and ignore the number of bytes sent

     * as the return value since we are using it in interrupt mode.

     */

    Status = XIicPs_MasterSendPolled(&Iic, SendBuffer,

             TEST_BUFFER_SIZE, IIC_SLAVE_ADDR);

    if (Status != XST_SUCCESS) {

        return XST_FAILURE;

    }

    /*

     * Wait until bus is idle to start another transfer.

     */

    while (XIicPs_BusIsBusy(&Iic)) {

        /* NOP */

    }

    Status = XIicPs_MasterRecvPolled(&Iic, RecvBuffer,

             TEST_BUFFER_SIZE, IIC_SLAVE_ADDR);

    if (Status != XST_SUCCESS) {

        return XST_FAILURE;

    }

    return XST_SUCCESS;

}

xiicps_master_polled_example.c.png

oscilloscope_Vout.jpg

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Hi @suung33

You need to modify the data being sent to the device. Currently, in the posted code, a 132-byte-long buffer filled with the sequence 0,1,2,3,... is being sent. You should refer to the I2C Serial Interface Communication section of the MCP4725 datasheet to determine what bytes you should be sending (https://www.microchip.com/en-us/product/MCP4725). Both the buffer contents should be changed to match whatever you need to send to the device and the buffer size argument passed the XIicPs_MasterSendPolled function should be modified to match the number of bytes you want to send. For example, from an initial skim of the datasheet, a general call reset should be able to be issued with the following snippet (though I haven't tested it), which sends two bytes, a 0x0 followed by a 0x6.

u8 SendBuf[2];
SendBuf[0] = 0;
SendBuf[1] = 0x6;
XIicPs_MasterSendPolled(&Iic, SendBuf, 2, IIC_SLAVE_ADDR);

Arduino sources can't be run directly on the Zybo, but you might use those projects to figure out what bytes you should be sending and receiving.

Thanks,

Arthur

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...