微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 有谁做过ublox I2C IIC 接口的

有谁做过ublox I2C IIC 接口的

时间:10-02 整理:3721RD 点击:
有谁做过ublox I2C IIC 接口的
一起讨论下
目前我这边是没有ack

已经调通了 有需要探讨的 给我留言呀

代码可不可以发给小弟参考一下啊

小编,能给我一份你写的代码吗?谢谢了

*****************************************************************************/
#ifdef __CUST_NEW__
#include "kal_release.h"
#include "dcl.h"
#include "kal_trace.h"
#include "gps_I2C.h"
#include "us_timer.h"               /* For ust_get_current_time() API*/
kal_bool gps_i2c_configure_done = KAL_FALSE;
extern const char gpio_sccb_serial_clk_pin;
extern const char gpio_sccb_serial_clk_pin_M_SCL;
extern const char gpio_sccb_serial_data_pin;
extern const char gpio_sccb_serial_data_pin_M_SDA;
//const char gpio_gps_i2c_data_pin=0xff;
//const char gpio_gps_i2c_clk_pin=0xff;
#define gpio_gps_i2c_clk_pin                 gpio_sccb_serial_clk_pin
#define gpio_gps_i2c_data_pin         gpio_sccb_serial_data_pin
//#define kal_prompt_ublox_leo_trace
#define  GPS_DELAY_TIMES  600

#define SET_CLK_OUT GPIO_InitIO(OUTPUT, gpio_gps_i2c_clk_pin);        
#define SET_CLK_IN         GPIO_InitIO(INPUT, gpio_gps_i2c_clk_pin);        
#define SET_CLK_HIGH GPIO_WriteIO(1, gpio_gps_i2c_clk_pin)
#define GET_CLK_BIT GPIO_ReadIO(gpio_gps_i2c_clk_pin)

DCL_HANDLE gps_i2c_handle;
DCL_HANDLE gps_pmu_handle;
#define GPS_I2C_DELAY \
{\
        volatile int count=0;\
        for(;count<GPS_DELAY_TIMES;count++);\
}
void gps_clk_check(void)
{
        SET_CLK_OUT;
        while(GET_CLK_BIT!=1)
        {
                SET_CLK_HIGH;
        }
}
void gps_ublox_check_scl(void)
{
        DCL_HANDLE  scl_handle;
        GPIO_CTRL_READ_T sda_read;
        
        scl_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_clk_pin);
        DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_0, NULL);
        DclGPIO_Control(scl_handle, GPIO_CMD_SET_DIR_IN, NULL);
        DclGPIO_Control(scl_handle, GPIO_CMD_READ, (DCL_CTRL_DATA_T *)&sda_read);
        
}
void gps_i2c_udelay(kal_uint32 delay)
{
        kal_uint32 ust = 0; //ust_get_current_time
        kal_uint32 count = 0;
        kal_uint32 break_count = 0;
        
        ust = ust_get_current_time();
        do{
                if(ust_get_current_time() != ust)
                        count++;
                else
                        break_count++;
        }while((count < delay) && (break_count < 0xFFFFFF));
}
void gps_i2c_configure(kal_uint32 slave_addr, kal_uint32 speed)
{
        I2C_CONFIG_T cfg;
        DCL_STATUS status;
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(!gps_i2c_configure_done)
                {
                        gps_i2c_handle = DclSI2C_Open(DCL_I2C, DCL_I2C_OWNER_CAMERA);
                }
                cfg.eOwner = DCL_I2C_OWNER_CAMERA;
                cfg.fgGetHandleWait = KAL_TRUE;
                cfg.u1SlaveAddress = slave_addr;
                cfg.u1DelayLen = 0;
                cfg.eTransactionMode = DCL_I2C_TRANSACTION_FAST_MODE;
                cfg.u4FastModeSpeed = speed;
                cfg.u4HSModeSpeed = 0;
                cfg.fgEnableDMA = KAL_FALSE;
         
                status=DclSI2C_Configure(gps_i2c_handle, (DCL_CONFIGURE_T *)&cfg);
                kal_prompt_ublox_leo_trace(0,"gps_i2c_configure():gps_i2c_handle=%d,status=%d",gps_i2c_handle,status);
        }
        
        gps_i2c_configure_done = KAL_TRUE;
}
void gps_i2c_power_on(kal_bool ON, kal_uint32 ldo, kal_uint32 ldo_volt)
{
        PMU_CTRL_LDO_BUCK_SET_VOLTAGE_EN pmu_ldo_voltage_en;
        PMU_CTRL_LDO_BUCK_SET_EN pmu_ldo_en;
               
        if (gps_pmu_handle==DCL_HANDLE_NONE)
                gps_pmu_handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
        
        if( ON && (ldo_volt != 0) )
        {
                pmu_ldo_voltage_en.mod = (PMU_LDO_BUCK_LIST_ENUM)ldo;
                pmu_ldo_voltage_en.voltage = (PMU_VOLTAGE_ENUM)ldo_volt;
                DclPMU_Control(gps_pmu_handle, LDO_BUCK_SET_VOLTAGE_EN,(DCL_CTRL_DATA_T *)& pmu_ldo_voltage_en);
        }
        else if( ON && (ldo_volt == 0) )
        {
                pmu_ldo_en.mod = (PMU_LDO_BUCK_LIST_ENUM)ldo;
                pmu_ldo_en.enable = KAL_TRUE;
                DclPMU_Control(gps_pmu_handle, LDO_BUCK_SET_EN,(DCL_CTRL_DATA_T *)&pmu_ldo_en);
        }
        else
        {
                pmu_ldo_en.mod = (PMU_LDO_BUCK_LIST_ENUM)ldo;
                pmu_ldo_en.enable = KAL_FALSE;
                DclPMU_Control(gps_pmu_handle, LDO_BUCK_SET_EN,(DCL_CTRL_DATA_T *)&pmu_ldo_en);
        }
}
// Start bit of I2C waveform
void gps_i2c_start(void)
{
        DCL_HANDLE sda_handle, scl_handle;
        kal_prompt_ublox_leo_trace(0,"++++++++++++++++++gps_i2c_start()++++++++++++++++++++\r\n");
        
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
        }
        else
        {               
                sda_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_data_pin);
                scl_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_clk_pin);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_MODE_0, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_0, NULL);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);               
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_DIR_OUT, NULL);
                //GPS_WriteGPIO(1,gpio_gps_i2c_data_pin);
                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_HIGH, NULL);
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);
                GPS_I2C_DELAY;
                //GPS_WriteGPIO(1,gpio_gps_i2c_clk_pin);
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
                //GPS_WriteGPIO(0,gpio_gps_i2c_data_pin);
                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
                //GPS_WriteGPIO(1,gpio_gps_i2c_clk_pin);
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
                //GPS_WriteGPIO(0,gpio_gps_i2c_data_pin);
                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
                //GPS_WriteGPIO(0,gpio_gps_i2c_clk_pin);
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
        }
}
// Stop bit of I2C waveform
void gps_i2c_stop(void)
{
        DCL_HANDLE sda_handle, scl_handle;
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
        }
        else
        {               
                sda_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_data_pin);
                scl_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_clk_pin);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_MODE_0, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_0, NULL);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_DIR_OUT, NULL);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_LOW, NULL);
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);
                GPS_I2C_DELAY;
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
        
                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
        }
        kal_prompt_ublox_leo_trace(0,"++++++++++++++++++gps_i2c_stop()++++++++++++++++++++\r\n");
        DclGPIO_Control(sda_handle, GPIO_CMD_SET_MODE_1, NULL);
        DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_1, NULL);
}
// Send one byte from host to client
kal_bool gps_i2c_send_byte(kal_uint8 ucData)
{
        //kal_bool bRet;
        int i;
        kal_bool ret;
        kal_uint8 ucMask;
        DCL_STATUS status = STATUS_INVALID_OPERATION;
        GPIO_CTRL_READ_T sda_read;
        I2C_CTRL_CONT_WRITE_T write;
        DCL_HANDLE sda_handle, scl_handle;
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        write.pu1Data = &ucData;
                        write.u4DataLen = 1;
                        write.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_WRITE, (DCL_CTRL_DATA_T *)&write);
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_send_byte():status=%d",status);
                }
                ret = (status == STATUS_OK)?KAL_TRUE:KAL_FALSE;
        }
        else
        {
                sda_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_data_pin);
                scl_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_clk_pin);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_MODE_0, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_0, NULL);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_DIR_OUT, NULL);
               
                for(i = 0, ucMask = 0x80; i < 8; i++, ucMask >>= 1)
                {
                        if(ucData & ucMask)
                                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_HIGH, NULL);
                        else
                                DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_LOW, NULL);
                        GPS_I2C_DELAY;
                        DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                        GPS_I2C_DELAY;
                        DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_LOW, NULL);
                        GPS_I2C_DELAY;
                }
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_IN, NULL);
        
                DclGPIO_Control(sda_handle, GPIO_CMD_READ, (DCL_CTRL_DATA_T *)&sda_read);
               
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
                //kal_prompt_ublox_leo_trace(0,"send ack=%d\r\n",sda_read.u1IOData);
                ret = (sda_read.u1IOData == GPIO_IO_HIGH)?KAL_TRUE:KAL_FALSE;
                //return sda_read.u1IOData;
        }
        return ret;
}
// Receive one byte form client to host
kal_uint8 gps_i2c_receive_byte(kal_bool bAck)
{
        kal_uint8 ucRet = 0;
        int i;
        I2C_CTRL_CONT_READ_T read;
        GPIO_CTRL_READ_T sda_read;
        DCL_STATUS status;
        DCL_HANDLE sda_handle, scl_handle;
        
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        read.pu1Data = &ucRet;
                        read.u4DataLen = 1;
                        read.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_READ, (DCL_CTRL_DATA_T *)&read);
                        
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_receive_byte():status=%d",status);
                        
                        ucRet = (status == STATUS_OK)?KAL_TRUE:KAL_FALSE;
                        
                }
        }
        else
        {
                gps_clk_check();
               
                sda_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_data_pin);
                scl_handle = DclGPIO_Open(DCL_GPIO, gpio_gps_i2c_clk_pin);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_MODE_0, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_MODE_0, NULL);
               
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_IN, NULL);
                DclGPIO_Control(scl_handle, GPIO_CMD_SET_DIR_OUT, NULL);
               
                for(i = 7; i >= 0; i--)
                {
                        DclGPIO_Control(sda_handle, GPIO_CMD_READ, (DCL_CTRL_DATA_T *)&sda_read);
                        ucRet |= sda_read.u1IOData << i;
        
                        DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                        GPS_I2C_DELAY;
                        DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_LOW, NULL);
                        GPS_I2C_DELAY;
                }
        
                DclGPIO_Control(sda_handle, GPIO_CMD_SET_DIR_OUT, NULL);
        
                if(bAck)
                        DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_HIGH, NULL);
                else
                        DclGPIO_Control(sda_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
        
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_HIGH, NULL);
                GPS_I2C_DELAY;
                DclGPIO_Control(scl_handle, GPIO_CMD_WRITE_LOW, NULL);
                GPS_I2C_DELAY;
        }
        return ucRet;
}
// I2C send data fuction
kal_bool gps_i2c_send(kal_uint8 ucDeviceAddr, kal_uint8 ucBufferIndex, kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_uint8 write_buf[9];
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_CONT_WRITE_T write;
        DCL_STATUS status;
        //kal_prompt_ublox_leo_trace(0,"gps_i2c_send()");
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        write_buf[0] = ucBufferIndex;
                        for(i=0;i<unDataLength;i++)
                        {
                                write_buf[i+1] = *(pucData+i);
                        }
                        write.pu1Data = write_buf;
                        write.u4DataLen = unDataLength+1;
                        write.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_WRITE, (DCL_CTRL_DATA_T *)&write);
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_send():status=%d",status);
                        if(status != STATUS_OK)
                                return KAL_FALSE;
                }
        }
        else
        {
                gps_i2c_start();
        
                if(gps_i2c_send_byte(ucDeviceAddr & 0xFE) == GPS_I2C_ACK)
                {
                        if(gps_i2c_send_byte(ucBufferIndex) == GPS_I2C_ACK)
                        {
                                for(i = 0; i < unDataLength; i++)
                                {
                                        if(gps_i2c_send_byte(pucData) == GPS_I2C_NAK)
                                        {
                                                bRet = KAL_FALSE;
                                                break;
                                        }
                                }
                        }
                        else
                        {
                                bRet = KAL_FALSE;
                        }
                }
                else
                {
                        bRet = KAL_FALSE;
                }
                gps_i2c_stop();
        }
        return bRet;
}
kal_bool gps_i2c_send_ubx(kal_uint8 ucDeviceAddr , kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_uint8 write_buf[9];
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_CONT_WRITE_T write;
        DCL_STATUS status;
        kal_bool ack;
        //kal_prompt_ublox_leo_trace(0,"gps_i2c_send()");
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        for(i=0;i<unDataLength;i++)
                        {
                                write_buf = *(pucData+i);
                        }
                        write.pu1Data = write_buf;
                        write.u4DataLen = unDataLength;
                        write.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_WRITE, (DCL_CTRL_DATA_T *)&write);
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_send():status=%d",status);
                        if(status != STATUS_OK)
                                return KAL_FALSE;
                }
        }
        else
        {
                gps_i2c_start();
        
                if(gps_i2c_send_byte(ucDeviceAddr & 0xFE) == GPS_I2C_ACK)
                {
                                for(i = 0; i < unDataLength; i++)
                                {
                                        ack=gps_i2c_send_byte(pucData);
                                       
                                       
                                        if(ack== GPS_I2C_NAK)
                                        {
                                                dbg_uart_print_trace_rn(0,"GPS_I2C_NAK[%d]",i);
                                                //bRet = KAL_FALSE;
                                                //break;
                                        }
                                        else
                                                dbg_uart_print_trace_rn(0,"GPS_I2C_ACK[%d]",i);
                                }
                }
                else
                {
                        dbg_uart_print_trace_rn(0,"gps_i2c_send():status=(ucDeviceAddr & 0xFE)");
                        bRet = KAL_FALSE;
                }
                gps_i2c_stop();
        }
        return bRet;
}
kal_bool gps_i2c_send_ext(kal_uint8 ucDeviceAddr, kal_uint16 ucBufferIndex, kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_uint8 write_buf[10];
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_CONT_WRITE_T write;
        DCL_STATUS status;
        kal_uint8 addr_h = ( ucBufferIndex >> 8 )& 0xFF;
        kal_uint8 addr_l = ucBufferIndex&0xFF;
        kal_uint32 offset = 0;
        kal_uint8  pkt_len;
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        while ( offset <= unDataLength )
                        {
                                write_buf[0] = ((ucBufferIndex + offset)>>8)&0xFF;
                                write_buf[1] = (ucBufferIndex + offset)&0xFF;
                                  if ( unDataLength - offset > 6 )
                                {
                                        pkt_len = 6;
                                }
                                else
                                {
                                        pkt_len = unDataLength - offset;
                                }
                                memcpy( &write_buf[2], &pucData[offset], pkt_len );
                                offset += pkt_len;
                                write.pu1Data = write_buf;
                                write.u4DataLen = pkt_len+2;
                                write.u4TransferNum = 1;
                                status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_WRITE, (DCL_CTRL_DATA_T *)&write);
                                if(status != STATUS_OK)
                                        return KAL_FALSE;
                                       
                                if ( offset == unDataLength )
                                        break;                                       
                        }
                }
        }
        else
        {
                gps_i2c_start();
        
                if(gps_i2c_send_byte(ucDeviceAddr & 0xFE) == GPS_I2C_ACK)
                {
                        if ( (gps_i2c_send_byte(addr_h) == GPS_I2C_ACK) &&
                                (gps_i2c_send_byte(addr_l) == GPS_I2C_ACK) )
                        {
                                for(i = 0; i < unDataLength; i++)
                                {
                                        if(gps_i2c_send_byte(pucData) == GPS_I2C_NAK)
                                        {
                                                bRet = KAL_FALSE;
                                                break;
                                        }
                                }
                        }
                        else
                        {
                                bRet = KAL_FALSE;
                        }
                }
                else
                {
                        bRet = KAL_FALSE;
                }
                gps_i2c_stop();
        }
        return bRet;
}
// I2C receive data function
kal_bool gps_i2c_receive(kal_uint8 ucDeviceAddr, kal_uint8 ucBufferIndex, kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_WRITE_AND_READE_T write_read;
        DCL_STATUS status;
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        write_read.pu1InData = pucData;
                        write_read.u4InDataLen = unDataLength;
                        write_read.pu1OutData = &ucBufferIndex;                        
                        write_read.u4OutDataLen = 1;
                        status=DclSI2C_Control(gps_i2c_handle, I2C_CMD_WRITE_AND_READ, (DCL_CTRL_DATA_T *)&write_read);
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_receive():status=%d",status);
                        if(status != STATUS_OK)
                                return KAL_FALSE;
                }
        }
        else
        {
                gps_i2c_start();
         
                if(gps_i2c_send_byte(ucDeviceAddr & 0xFE) == GPS_I2C_ACK)
                {
                        if(gps_i2c_send_byte(ucBufferIndex) == GPS_I2C_ACK)
                        {
                                gps_i2c_start();
         
                                if(gps_i2c_send_byte(ucDeviceAddr | 0x01) == GPS_I2C_ACK)
                                {
                                        for(i = 0; i < unDataLength - 1; i++)
                                        {
                                                kal_uint8  tmp;
                                                tmp=pucData = gps_i2c_receive_byte((kal_bool)GPS_I2C_ACK);
                                                 if(tmp<0x7F)
                                                 {
                                                         kal_prompt_ublox_leo_trace(0,"%c",(char)tmp);
                                                        // pucData[j++]=tmp;
                                                         //pucData[j]=0;
                                                 }
                                        }
                                        pucData[unDataLength - 1] = gps_i2c_receive_byte((kal_bool)GPS_I2C_NAK);
                                }
                                else
                                {
                                        kal_prompt_ublox_leo_trace(0,"send_byte no ACK\r\n");
                                        bRet = KAL_FALSE;
                                }
                        }
                        else
                        {
                                kal_prompt_ublox_leo_trace(0,"BufferAddr no ACK\r\n");
                                bRet = KAL_FALSE;
                        }
                }
                else
                {
                        kal_prompt_ublox_leo_trace(0,"DeviceAddr no ACK\r\n");
                        bRet = KAL_FALSE;
                }
                gps_i2c_stop();
        }
        return bRet;
}
// I2C receive data function
kal_bool gps_i2c_receive_no_addr_(kal_uint8 ucDeviceAddr, kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_CONT_READ_T read;
        DCL_STATUS status;
        
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        read.pu1Data = pucData;
                        read.u4DataLen = unDataLength;
                        read.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_READ, (DCL_CTRL_DATA_T *)&read);
                        
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_receive_no_addr():status=%d",status);
                        kal_prompt_ublox_leo_trace(0,"%s",read.pu1Data);
                        
                        bRet = (status == STATUS_OK)?KAL_TRUE:KAL_FALSE;
                }
        }
        else
        {
         
                gps_i2c_start();
                if(gps_i2c_send_byte(ucDeviceAddr | 0x01) == GPS_I2C_ACK)
                {
                        int j=0;
                        kal_uint8 tmp;
                        for(i = 0; i < unDataLength ; i++)
                        {
                                 tmp= gps_i2c_receive_byte((kal_bool)GPS_I2C_ACK);
                                 if(tmp<0x7F)
                                 {
                                         kal_prompt_ublox_leo_trace(0,"%c",(char)tmp);
                                         pucData[j++]=tmp;
                                         pucData[j]=0;
                                 }
                        }
                }
                else
                {
                        bRet = KAL_FALSE;
                }
               
                gps_i2c_stop();
        }
        return bRet;
}

// I2C receive data function
kal_bool gps_i2c_receive_no_addr(kal_uint8 ucDeviceAddr, kal_uint8* pucData, kal_uint32 unDataLength)
{
        kal_uint32 i;
        kal_bool bRet = KAL_TRUE;
        I2C_CTRL_CONT_READ_T read;
        DCL_STATUS status;
        
        if(gpio_gps_i2c_data_pin == 0xFF) // HW I2C
        {
                if(gps_i2c_configure_done)
                {
                        read.pu1Data = pucData;
                        read.u4DataLen = unDataLength;
                        read.u4TransferNum = 1;
                        status = DclSI2C_Control(gps_i2c_handle, I2C_CMD_CONT_READ, (DCL_CTRL_DATA_T *)&read);
                        
                        kal_prompt_ublox_leo_trace(0,"gps_i2c_receive_no_addr():status=%d",status);
                        kal_prompt_ublox_leo_trace(0,"%s",read.pu1Data);
                        
                        bRet = (status == STATUS_OK)?KAL_TRUE:KAL_FALSE;
                }
   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top