1
0
This repository has been archived on 2024-09-17. You can view files and clone it, but cannot push or open issues or pull requests.
tor-heredero-tokenring/RTE/uGFX_library/stm32f7_i2c.c

83 lines
2.1 KiB
C
Raw Permalink Normal View History

2024-04-10 17:17:57 +00:00
#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, &regAddr, 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, &regAddr, 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));
}