2025-05-21 11:31:07 +08:00

116 lines
3.0 KiB
C

#include "drv_master_iic.h"
#define I2C_TIMEOUT (0x1800U)
#define I2C_BUFFER_LENGTH (8U)
static uint32_t s_timeout = I2C_TIMEOUT;
static status_t status = STATUS_SUCCESS;
static uint32_t s_byteRemaining = 8U;
static bool ACK;
void bsp_drv_master_iic_init(void)
{
/* Configure I2C */
I2C_MasterInit(&flexio_instance, &i2c_pal_flexio_MasterConfig0);
}
void bsp_drv_master_iic_deinit(void)
{
I2C_MasterDeinit(&flexio_instance);
}
int bsp_drv_maste_iic_set_slave_address(uint16_t address)
{
return I2C_MasterSetSlaveAddress(&flexio_instance, address, false);
}
bool bsp_drv_master_iic_read(uint8_t *pBuf,int len ,bool sendstop)
{
s_timeout = I2C_TIMEOUT;
status = I2C_MasterReceiveData(&flexio_instance, pBuf, len, sendstop);
if (status == STATUS_SUCCESS)
{
do
{
s_timeout--;
status = I2C_MasterGetTransferStatus(&flexio_instance, &s_byteRemaining);
} while ((s_timeout != 0U) && (status != STATUS_SUCCESS));
if ((s_byteRemaining != 0U) || (s_timeout == 0U))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
bool bsp_drv_master_iic_write(const uint8_t *pBuf,int len, bool sendstop)
{
s_timeout = I2C_TIMEOUT;
status = I2C_MasterSendData(&flexio_instance, pBuf, len, sendstop);
if (status == STATUS_SUCCESS)
{
do
{
s_timeout--;
status = I2C_MasterGetTransferStatus(&flexio_instance, &s_byteRemaining);
} while ((s_timeout != 0U) && (status != STATUS_SUCCESS));
if ((s_byteRemaining != 0U) || (s_timeout == 0U))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
bool bsp_ctrl_write_register(uint16_t address, uint8_t *buf, uint8_t len)
{
bsp_drv_maste_iic_set_slave_address(address);
ACK = bsp_drv_master_iic_write(buf,len,false);
return ACK;
}
bool bsp_ctrl_read_register(uint16_t address,uint8_t pos, uint8_t *buf, uint8_t len)
{
bsp_drv_maste_iic_set_slave_address(address);
ACK = bsp_drv_master_iic_write(&pos,1,false);
if(ACK == true)
ACK = bsp_drv_master_iic_read(buf,len,true);
return ACK;
}
bool bsp_ctrl_read_pair_register(uint16_t address,short pos, uint8_t *buf, uint8_t len)
{
uint8_t array[2] = {(pos>>8)&0xFF,(pos)&0xFF};
ACK = bsp_drv_master_iic_write(array,2,false);
if(ACK)
{
bsp_drv_maste_iic_set_slave_address(address);
ACK = bsp_drv_master_iic_read(buf,len,true);
}
return ACK;
}
void bsp_ctrl_wirte_polling(uint16_t address,uint8_t* s_transmitBuffer,uint32_t I2C_TX_BUFFER_LENGTH)
{
bsp_drv_maste_iic_set_slave_address(address);
bsp_drv_master_iic_write(s_transmitBuffer,I2C_BUFFER_LENGTH,true);
}
void bsp_ctrl_read_polling(uint16_t address, uint8_t* s_receiveBuffer,uint32_t I2C_RX_BUFFER_LENGTH)
{
bsp_drv_maste_iic_set_slave_address(address);
bsp_drv_master_iic_read(s_receiveBuffer,I2C_BUFFER_LENGTH,true);
}