cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 5, 3 & 1 MCU

Anonymous
Not applicable

Please teach me how to transmit data to external 16 bit D/AC (AD5696, Analog Devices) by using I2C master in PSoC 5LP. I programmed C firmware refer to Sample Code "DelSig_I2CM" in PSoC creator, not only D/AC didn't work , but also SDA and SCL signal have been seen using oscilloscope.

   

-------------------------------------------------------------------------------------------

   

/* Parameters used:
*  I2C Master
*   Implementation      Fixed function
*   Data rate           400kbps
*   SDA SCL pin config  Open drain, drives low
*   Pull-up resistors   1.8kΩ each
*
*  Delta Sigma ADC
*    Resolution            12 bits
*    Conversion Rate       1000000 SPS
*    Input mode            Single ended
*/

   

#include <project.h>
#define I2C_SLAVE_ADDRESS    (12u)
#define WR_BUFFER_SIZE       (2u)

   

uint8   X_IN = 0u;
uint8   temp = 0u;
uint8   sample_segment[WR_BUFFER_SIZE];
uint16  result[3] = {0u};

   

int main(void)
{
    ADC_SAR_IN_Start();
    ADC_SAR_IN_StartConvert();
    I2CM_Start();
    CyGlobalIntEnable;
    
    for(;;)
    {   
        ADC_SAR_IN_IsEndConversion(ADC_SAR_IN_WAIT_FOR_RESULT);
        result[X_IN] = ADC_SAR_IN_GetResult16();
        sample_segment[0] = result[X_IN] >> 8u & 0x00FFu;
        sample_segment[1] = result[X_IN] & 0x00FFu;
        do
        {
            temp = I2CM_MasterWriteBuf(I2C_SLAVE_ADDRESS, (uint8 *)sample_segment, WR_BUFFER_SIZE, I2CM_MODE_COMPLETE_XFER);
        }
        while(temp != I2CM_MSTR_NO_ERROR);
        while(I2CM_MasterStatus() & I2CM_MSTAT_XFER_INP);
        temp = I2CM_MasterClearStatus();
    }
}

0 Likes
Reply
1 Solution
Esteemed Contributor II

You have got two candidates for infinite loops in your program which can be overcome by a reset only.

   

        while(temp != I2CM_MSTR_NO_ERROR);
        while(I2CM_MasterStatus() & I2CM_MSTAT_XFER_INP);
I would consider a different solution in case of detected errors or timeouts.

   

It is much easier for us to help you, when you post your complete project, so that we all can have a look at all of your settings. To do so, use
Creator->File->Create Workspace Bundle (minimal)
and attach the resulting file.

   

 

   

Bob

View solution in original post

0 Likes
Reply
2 Replies
Employee

thanks.

0 Likes
Reply
Esteemed Contributor II

You have got two candidates for infinite loops in your program which can be overcome by a reset only.

   

        while(temp != I2CM_MSTR_NO_ERROR);
        while(I2CM_MasterStatus() & I2CM_MSTAT_XFER_INP);
I would consider a different solution in case of detected errors or timeouts.

   

It is much easier for us to help you, when you post your complete project, so that we all can have a look at all of your settings. To do so, use
Creator->File->Create Workspace Bundle (minimal)
and attach the resulting file.

   

 

   

Bob

View solution in original post

0 Likes
Reply