83 lines
2.1 KiB
C
83 lines
2.1 KiB
C
#include "gfx.h"
|
|
|
|
#include "stm32f7_i2c.h"
|
|
#include "Driver_I2C.h"
|
|
|
|
/* I2C Driver */
|
|
extern ARM_DRIVER_I2C Driver_I2C3;
|
|
static ARM_DRIVER_I2C * I2Cdrv = &Driver_I2C3;
|
|
|
|
|
|
#ifndef EEPROM_I2C_PORT
|
|
#define EEPROM_I2C_PORT 3 /* I2C Port number */
|
|
#endif
|
|
|
|
|
|
#define A_WR 0 /* Master will write to the I2C */
|
|
#define A_RD 1 /* Master will read from the I2C */
|
|
|
|
static uint8_t wr_buf[256];
|
|
uint8_t gI2CAccess = 0;
|
|
bool_t i2cInit(I2C_TypeDef* i2c)
|
|
{
|
|
gI2CAccess = 1;
|
|
I2Cdrv->Initialize (NULL);
|
|
I2Cdrv->PowerControl (ARM_POWER_FULL);
|
|
I2Cdrv->Control (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
|
|
I2Cdrv->Control (ARM_I2C_BUS_CLEAR, 0);
|
|
gI2CAccess = 0;
|
|
|
|
|
|
return 1; // just says no error
|
|
}
|
|
|
|
|
|
void i2cWriteReg(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr, uint8_t value)
|
|
{
|
|
wr_buf[0] = regAddr;
|
|
wr_buf[1] = value;
|
|
gI2CAccess = 1;
|
|
|
|
I2Cdrv->MasterTransmit (slaveAddr/2, wr_buf, 2, false);
|
|
while (I2Cdrv->GetStatus().busy);
|
|
if (I2Cdrv->GetDataCount () != 2) return;
|
|
/* Acknowledge polling */
|
|
gI2CAccess = 0;
|
|
|
|
// do {
|
|
// I2Cdrv->MasterReceive (DeviceAddr, &wr_buf[0], 1, false);
|
|
// while (I2Cdrv->GetStatus().busy);
|
|
// } while (I2Cdrv->GetDataCount () < 0);
|
|
|
|
}
|
|
|
|
uint8_t i2cReadByte(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr)
|
|
{
|
|
uint8_t ret = 0;
|
|
gI2CAccess = 1;
|
|
|
|
I2Cdrv->MasterTransmit (slaveAddr/2, ®Addr, 1, true);
|
|
while (I2Cdrv->GetStatus().busy);
|
|
I2Cdrv->MasterReceive (slaveAddr/2, &ret, 1, false);
|
|
while (I2Cdrv->GetStatus().busy);
|
|
if (I2Cdrv->GetDataCount () != 1) return 0xAA;
|
|
gI2CAccess = 0;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint16_t i2cReadWord(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr)
|
|
{
|
|
uint8_t ret[2] = { 0, 0 };
|
|
gI2CAccess = 1;
|
|
|
|
I2Cdrv->MasterTransmit (slaveAddr/2, ®Addr, 1, true);
|
|
while (I2Cdrv->GetStatus().busy);
|
|
I2Cdrv->MasterReceive (slaveAddr/2, ret, 2, false);
|
|
while (I2Cdrv->GetStatus().busy);
|
|
if (I2Cdrv->GetDataCount () != 2) return 0xAAAA;
|
|
gI2CAccess = 0;
|
|
|
|
return (uint16_t)((ret[0] << 8) | (ret[1] & 0x00FF));
|
|
}
|