parent
fb58ceb58f
commit
0ecc6496af
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,130 @@
|
||||
#include "i2c.h"
|
||||
#include "usart.h"
|
||||
|
||||
void i2cInit( i2c_t *i2cHardware,
|
||||
i2cCh_t channelNo,
|
||||
i2cMode_t mode,
|
||||
uint16_t mainAddress,
|
||||
uint16_t secondAddress,
|
||||
i2cAddressCount_t addressCount,
|
||||
i2cAddressSize_t addressSize,
|
||||
i2cSpeed_t speed,
|
||||
i2cOpperationMode_t opperationMode,
|
||||
i2cClockStretching_t stretching,
|
||||
i2cWakeUpTypes_t wakeOn)
|
||||
{
|
||||
i2cHardware->channelNo = channelNo;
|
||||
i2cHardware->mode = mode;
|
||||
i2cHardware->mainAddress = mainAddress;
|
||||
i2cHardware->secondAddress = secondAddress;
|
||||
i2cHardware->addressCount = addressCount;
|
||||
i2cHardware->addressSize = addressSize;
|
||||
i2cHardware->speed = speed;
|
||||
i2cHardware->opperationMode = opperationMode;
|
||||
i2cHardware->stretching = stretching;
|
||||
i2cHardware->wakeOn = wakeOn;
|
||||
i2cHardware->hardwareState = i2cHwIdle;
|
||||
i2cHardware->periferalState = i2cPerifNotInitialized;
|
||||
|
||||
i2cEnableHardware(i2cHardware);
|
||||
i2cDisablePeriferal(i2cHardware);
|
||||
i2cConfigureFilters(i2cHardware);
|
||||
i2cSetClockStretch(i2cHardware, stretching);
|
||||
i2cSetSpeed(i2cHardware, speed);
|
||||
i2cSetMode(i2cHardware, opperationMode);
|
||||
i2cSetAddressLenght(i2cHardware, addressSize);
|
||||
i2cSetAddress(i2cHardware, mainAddress, secondAddress);
|
||||
i2cEnablePeriferal(i2cHardware);
|
||||
|
||||
while(i2cHardware->periferalState != i2cPerifReady)
|
||||
{
|
||||
i2cIsPeriferalReady(i2cHardware);
|
||||
}
|
||||
|
||||
i2cHardware->periferalState = i2cPerifInitialized;
|
||||
}
|
||||
|
||||
|
||||
void i2cDeInit(i2c_t *i2cHardware)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void i2cRead(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
||||
{
|
||||
|
||||
//
|
||||
// Start
|
||||
// Send Address
|
||||
// Wait For ACK
|
||||
//
|
||||
uint8_t nbytes = 0;
|
||||
|
||||
i2cHardware->periferalState = i2cPerifTransmitting;
|
||||
|
||||
i2cSetTransferCounter(i2cHardware,1);
|
||||
i2cSendSlaveAddressWrite(i2cHardware, slaveAddress);
|
||||
i2cSendRegisterAddress(i2cHardware,registerAddress);
|
||||
|
||||
while(i2cHardware->periferalState != i2cPerifTransferComplete)
|
||||
{
|
||||
i2cIsTransferComplete(i2cHardware);
|
||||
}
|
||||
|
||||
i2cHardware->periferalState = i2cPerifRecieving;
|
||||
i2cSendSlaveAddressRead(i2cHardware, slaveAddress);
|
||||
|
||||
|
||||
while(i2cHardware->periferalState != i2cPerifTransferComplete)
|
||||
{
|
||||
i2cIsTransferComplete(i2cHardware);
|
||||
}
|
||||
|
||||
i2cGenerateNack(i2cHardware);
|
||||
i2cGenerateStop(i2cHardware);
|
||||
|
||||
i2cReadInputRegister(i2cHardware, data);
|
||||
|
||||
print_Usart(usart2, "\n\rI2C Read completed\n\r");
|
||||
|
||||
while(i2cHardware->periferalState != i2cPerifReady)
|
||||
{
|
||||
i2cIsPeriferalReady(i2cHardware);
|
||||
}
|
||||
i2cHardware->periferalState = i2cPerifReady;
|
||||
i2cHardware->hardwareState = i2cHwIdle;
|
||||
}
|
||||
|
||||
void i2cWrite(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
||||
{
|
||||
i2cSetTransferCounter(i2cHardware,2);
|
||||
i2cSendSlaveAddressWrite(i2cHardware, slaveAddress);
|
||||
i2cSendRegisterAddress(i2cHardware,registerAddress);
|
||||
while((i2cHardware->hardwareState =! i2cHwOutputBufferEmpty))
|
||||
{
|
||||
i2cIsOutputBufferEmpty(i2cHardware);
|
||||
}
|
||||
i2cSendData(i2cHardware,data);
|
||||
|
||||
i2cGenerateStop(i2cHardware);
|
||||
print_Usart(usart2, "\n\rI2C Transfer completed\n\r");
|
||||
}
|
||||
|
||||
void i2cThrowError(i2c_t *i2cHardware, int16_t error)
|
||||
{
|
||||
print_Usart(usart2, "\n\r");
|
||||
print_Usart(usart2, "\n\r");
|
||||
print_Usart(usart2, "I2C Error Detected : ");
|
||||
|
||||
if (i2cHardware->periferalState == i2cPerifTransmitting)
|
||||
print_Usart(usart2, "i2cPerifTransmitting");
|
||||
if (i2cHardware->periferalState == i2cPerifRecieving)
|
||||
print_Usart(usart2, "i2cPerifRecieving");
|
||||
|
||||
print_Usart(usart2, "\n\r");
|
||||
print_Usart(usart2, "I2C Error No: ");
|
||||
usartSendChar(usart2, error + 0x30);
|
||||
print_Usart(usart2, "\n\r");
|
||||
print_Usart(usart2, "\n\r");
|
||||
}
|
@ -0,0 +1,565 @@
|
||||
/**
|
||||
**************************************************************************************************
|
||||
* @file i2c.h
|
||||
* @author Kerem Yollu & Edwin Koch
|
||||
* @date 18.07.2022
|
||||
* @version 1.01
|
||||
**************************************************************************************************
|
||||
* @brief I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips :
|
||||
* following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA
|
||||
* This will also not have a I3C support for the forseable futrue.
|
||||
*
|
||||
* **Detailed Description :**
|
||||
*
|
||||
* I2C communitation based on the Standart I2C Protocol V7 Defined by NXP/Philips :
|
||||
* following third Party Protocols based on I2C Bus are not going to be implemented : C-BUS SMBUS PMBUS IPMI DDC ATCA
|
||||
* This will also not have a I3C support for the forseable futrue.
|
||||
*
|
||||
* @todo
|
||||
* - 26.07.2021 : Implement the DMA
|
||||
* - 26.07.2021 : Implement the Interrupt
|
||||
* - 26.07.2021 : Implement the Sleep/WakeUp
|
||||
* - 26.07.2021 : Implement the Slave opperation
|
||||
**************************************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _I2C_H_
|
||||
#define _I2C_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "hardwareDescription.h"
|
||||
#include "pin.h"
|
||||
|
||||
|
||||
|
||||
/*! Enum of possible I2C opperation modes */
|
||||
typedef enum{
|
||||
i2cModeMaster, /*!< Master mode : In Master mode, the I2C interface initiates
|
||||
a data transfer and generates the clock signal. **DEFAULT** */
|
||||
i2cModeMultyMaster, /*!< Multimaster Mode : In case if more than one master are present
|
||||
in one I2C bus. In such case each device needs to be able to
|
||||
cooperate knowing that another device could talking
|
||||
therefore the bus is busy (Arbirtation).
|
||||
For More information : https://www.i2c-bus.org/multimaster/ */
|
||||
i2cModeSlave /*!< Slave mode : A slave device has to always be ready to detect and
|
||||
process a start condition and to recognize its address */
|
||||
}i2cMode_t;
|
||||
|
||||
/*! Enum of possible I2C speeds */
|
||||
typedef enum{
|
||||
i2cSpeedStandart, /*!< SM 100 kbits/s Standart i2c Speed **DEFAULT** */
|
||||
i2cSpeedFast, /*!< FM 400 kbits/s */
|
||||
i2cSpeedFastPlus, /*!< FM+ 1 Mbits/s */
|
||||
i2cSpeedHightSpeed, /*!< HS 3.4 Mbits/s */
|
||||
i2cSpeedUltraFast /*!< UFM 5 Mbits/s */
|
||||
}i2cSpeed_t;
|
||||
|
||||
/*! Enum of possible I2C Adress sizes */
|
||||
typedef enum{
|
||||
i2cAddressSizeSevenBits, /*!< 7 Bits address size **DEFAULT** */
|
||||
i2cAddressSizeTenBits /*!< 10 Bits address size */
|
||||
}i2cAddressSize_t;
|
||||
|
||||
/*! Enum of possible I2C Address count */
|
||||
typedef enum{
|
||||
i2cAddressCountSingle, /*!< Only one address for communication **DEFAULT** */
|
||||
i2cAddressCountDual /*!< Dual addresses for one device respondng to two addresses */
|
||||
}i2cAddressCount_t;
|
||||
|
||||
/*! Enum for clock strechning activation. Can only be implmented as Slave
|
||||
* for more information : https://www.i2c-bus.org/clock-stretching/ */
|
||||
typedef enum{
|
||||
i2cClockStretchingDisable, /*!< We assume that the master and slave have compatible
|
||||
Clock frequencies **DEFAULT** */
|
||||
i2cClockStretchingEnable /*!< In situations where an I2C slave is not able to co-operate
|
||||
with the clock speed given by the master and needs to slow down.
|
||||
This is done by a mechanism referred to as clock stretching. */
|
||||
}i2cClockStretching_t;
|
||||
|
||||
/*! Enum for diffenrent wake up methodes wehnin sleep mode */
|
||||
typedef enum{
|
||||
i2cWakeUpDisabled, /*!< No wake up is possible this is the default mode also means that
|
||||
the sleep function is not implmentes **DEFAULT** */
|
||||
i2cWakeUpOnAddressMatch /*!< Wakes up on address match, this can be harware dependent */
|
||||
}i2cWakeUpTypes_t;
|
||||
|
||||
/*! Enum operation mode of the i2c channel */
|
||||
typedef enum{
|
||||
i2cOpperationPolling, /*!< Polling mode Blocking, i2c communication states are constantly
|
||||
checked on polling mode so it can be stoped
|
||||
when interrupts occures **DEFAULT** */
|
||||
i2cOpperationInt, /*!< Interrut Mode Non-blocking, i2c communications state changes
|
||||
generates an interrupt and can be handeled this way */
|
||||
i2cOpperationDma /*!< DMA Mode Non-blocking, I2C communication satets are managed
|
||||
via Inteerupts and with Direct Memory Access */
|
||||
}i2cOpperationMode_t;
|
||||
|
||||
/*! typedef for the i2c states*/
|
||||
typedef enum
|
||||
{
|
||||
i2cHwIdle, /*!< Hardware is in Idle Mode **DEFAULT** */
|
||||
i2cHwStartGenerated, /*!< Generated the star condition */
|
||||
i2cHwOutputBufferFull, /*!< The output buffer of the I2C Periferal is Full */
|
||||
i2cHwOutputBufferEmpty, /*!< The output buffer of the I2C Periferal is Empty */
|
||||
i2cHwInputBufferFull, /*!< The input buffer of the I2C Periferal Is Full */
|
||||
i2cHwInputBufferEmpty, /*!< The input buffer of the I2C Periferal Is Empty */
|
||||
i2cHwSentRead, /*!< Sent read request */
|
||||
i2cHwSentWrite, /*!< Sent write request */
|
||||
i2cHwGotAck, /*!< Recieved ACK */
|
||||
i2cHwGotNack, /*!< Recieved NACK */
|
||||
i2cHwSentAck, /*!< Sent ACK */
|
||||
i2cHwSentNack, /*!< Sent NACK */
|
||||
i2cHwStopGenerated, /*!< Generated the star condition */
|
||||
i2cHwError /*!< Error */
|
||||
} i2cHardwareState_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
i2cPerifNotInitialized, /*!< Default Peripheral is not yet Initialized **DEFAULT** */
|
||||
i2cPerifInitialized, /*!< I2C CHannle is initilized but not neceserly ready */
|
||||
i2cPerifSlaveAddressSent, /*!< The Salve Address Was Sent to the bus */
|
||||
i2cPerifTransferComplete, /*!< A full communication process is complete (wire or Read) */
|
||||
i2cPerifTransferOngoign, /*!< A full communication process is in progress (wire or Read) */
|
||||
i2cPerifReady, /*!< Peripheral Initialized and ready for use */
|
||||
i2cPerifSlaveNotFound, /*!< Desired Slave was not able to be found */
|
||||
i2cPerifTransmitting, /*!< Data Transmission process is ongoing */
|
||||
i2cPerifRecieving, /*!< Data Reception process is ongoing */
|
||||
i2cPerifListening, /*!< Address Listen Mode is ongoing */
|
||||
i2cPerifListeningAndTransmitting, /*!< Address Listen Mode and ongoing Data Transmission */
|
||||
i2cPerifListeningAndRecieveing, /*!< Address Listen Mode and ongoing Data Reception */
|
||||
i2cPerifAbort, /*!< Abort user request ongoing */
|
||||
i2cPerifTimeout, /*!< Timeout state */
|
||||
i2cPerifError /*!< Error */
|
||||
} i2cPeriferalState_t;
|
||||
/*! Struture a an i2c channel with all the required propereties*/
|
||||
typedef struct i2c_t
|
||||
{
|
||||
i2cCh_t channelNo; /*!< The harware channel to be used */
|
||||
i2cMode_t mode; /*!< Master, Slave or Multymaster Modes */
|
||||
uint16_t mainAddress; /*!< First and Main address of the device */
|
||||
uint16_t secondAddress; /*!< Second address if dual addresse mode is configured */
|
||||
i2cAddressCount_t addressCount; /*!< Single or multiple */
|
||||
i2cAddressSize_t addressSize; /*!< 10 or 7 bit address size */
|
||||
i2cSpeed_t speed; /*!< Bus Speed */
|
||||
i2cOpperationMode_t opperationMode; /*!< Blocking or non blocking polling, Int or DMA */
|
||||
i2cClockStretching_t stretching; /*!< Clock Stretching enable onyl in slave mode */
|
||||
i2cWakeUpTypes_t wakeOn; /*!< Define on which type of action the i2c channel should
|
||||
wake up. Only if de prefiral goes to sleep */
|
||||
i2cHardwareState_t hardwareState; /*!< The current sitate of the I2C Bus */
|
||||
i2cPeriferalState_t periferalState; /*!< The current sitate of the I2C Bus */
|
||||
}i2c_t;
|
||||
|
||||
/***************************************************************************************************
|
||||
I2C Configuration functions
|
||||
***************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Initilize the I2C Hardware
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cInit( i2c_t *i2cHardware, /*!< Pointer to I2C hardware Object */
|
||||
i2cCh_t channelNo, /*!< The harware channel to be used */
|
||||
i2cMode_t mode, /*!< Master, Slave or Multymaster Modes */
|
||||
uint16_t mainAddress, /*!< First and Main address of the device */
|
||||
uint16_t secondAddress, /*!< Second address if dual addresse mode is configured */
|
||||
i2cAddressCount_t addressCount, /*!< Single or multiple */
|
||||
i2cAddressSize_t addressSize, /*!< 10 or 7 bit address size */
|
||||
i2cSpeed_t speed, /*!< Bus Speed */
|
||||
i2cOpperationMode_t opperationMode, /*!< Blocking or non blocking polling, Int or DMA */
|
||||
i2cClockStretching_t stretching, /*!< Clock Stretching enable onyl in slave mode */
|
||||
i2cWakeUpTypes_t wakeOn /*!< Wake up condition */
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief De-Initilize the I2C Hardware
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cDeInit(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Set the i2c channle to the gievn mode
|
||||
* @param Channel is the i2c hardware channel
|
||||
* @param mode The mode for i2c : Master Slave or Multymaster
|
||||
*/
|
||||
void i2cSetMode(i2c_t *i2cHardware, i2cMode_t mode);
|
||||
|
||||
/**
|
||||
* @brief Set the i2c channles mode as Master Slave or Multymaster
|
||||
* @param i2cHardware is the i2c hardware channel
|
||||
* @param addressOne The forst address for the device
|
||||
* @param addressTwo The second address for the device only if dual address mode is not defined
|
||||
*/
|
||||
void i2cSetAddress(i2c_t *i2cHardware, uint16_t mainAddress, uint16_t secondAddress);
|
||||
|
||||
/**
|
||||
* @brief Set the i2c Address Lenght, 7 bit or 8 bit, Master or slave doesn't make any difference
|
||||
* @param i2cHardware is the i2c hardware channel
|
||||
* @param size Is the Adress isze to be used 7 Bit or 10 Bit
|
||||
*/
|
||||
void i2cSetAddressLenght(i2c_t *i2cHardware, i2cAddressSize_t size);
|
||||
|
||||
/**
|
||||
* @brief Stets the Communication speed
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param speed the different awailable speeds
|
||||
*/
|
||||
void i2cSetSpeed(i2c_t *i2cHardware, i2cSpeed_t speed);
|
||||
|
||||
/**
|
||||
* @brief Initiates the opperation mode for the selected i2c Channel
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param opperation define if the i2c channel will opperate on pollin, Interrupt, or DMA modes
|
||||
*/
|
||||
void i2cSetOpperation(i2c_t *i2cHardware, i2cOpperationMode_t opperation);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Ebales or disables clock stretching functionalities
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param The value to be written in the register. This will heavily depend on the hardware
|
||||
*/
|
||||
void i2cSetClockStretch(i2c_t *i2cHardware, i2cClockStretching_t stretching);
|
||||
|
||||
/**
|
||||
* @brief Set the wakeup mode
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param wake the desider wakeup mode for now i have found only one mode.
|
||||
*/
|
||||
void i2cSetWakeup(i2c_t *i2cHardware, i2cWakeUpTypes_t wake);
|
||||
|
||||
/**
|
||||
* @brief Configures Hardware implmente filters if there are any.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cConfigureFilters(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Set the timeout to close the i2c wait time if a communication fails.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param timeout the desider timeout duration in ticks.
|
||||
*/
|
||||
void i2cSetTimeout(i2c_t *i2cHardware, uint8_t timeout);
|
||||
|
||||
/**
|
||||
* @brief Resets the i2c Periferal to it's inital state.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cPeriferalReset(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Resets the i2c Harware and register to it's factory deflauts.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cHardwareReset(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Enables I2C Hardware BUS & Clock & Pins
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cEnableHardware(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Enables I2C Periferal core.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cEnablePeriferal(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Disables I2C Periferal core.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cDisablePeriferal(i2c_t *i2cHardware);
|
||||
|
||||
/**************************************************************************************************
|
||||
I2C Communication functions independen of opperating mode
|
||||
***************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Writes the given amount of data to the selected device. This function will
|
||||
* automaticaly choose between i2cMasterSend(); or i2cSlaveSend();
|
||||
* Depending if the I2C channel was initiated as slave or master.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data to be written
|
||||
* @param dataLenght is the total quantity of 8 bit data to be written.
|
||||
*/
|
||||
void i2cWrite(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght);
|
||||
|
||||
/**
|
||||
* @brief Reads the given amount of data to the selected device. This function will
|
||||
* automaticaly choose between i2cMasterRecieve(); or i2cSlaveRecieve();
|
||||
* Depending if the I2C channel was initiated as slave or master.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data which has been red
|
||||
* @paran dataLenght is the total quantity of 8 bit data to be red
|
||||
*/
|
||||
void i2cRead(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght);
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte as master from from the given devices register.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cMasterRecieve(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
/**
|
||||
* @brief Sends a Single Byte as master to the given devices register.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the send command will be sent
|
||||
* @param registerAddress is the regiter to be written to the device
|
||||
* @param data is the data to be sent
|
||||
*/
|
||||
void i2cMasterSend(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte as slave from given devices register.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cSlaveRecieve(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte as slave from the given devices register.
|
||||
* this function will adapt himself to the selected oppeartion mode (Polling / Int / DMA)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cSlaveSend(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**************************************************************************************************
|
||||
I2C Hardware functions
|
||||
***************************************************************************************************/
|
||||
/**
|
||||
* @brief Checks if the device is ready for any type of communication
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cIsPeriferalReady(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Generates a Start condition.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cGenerateStart(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Generates a Start condition.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cGenerateStop(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Generates a NACK condition.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cGenerateNack(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Checks If a NACK is recieved.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
uint8_t i2cCheckNack(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Generates a ACK condition.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cGenerateAck(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Initiates the communication by sending the slave address on the bus followed by a WRITE
|
||||
* and waits for an ACK (aknowledge)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress The address of the slave to be communicated
|
||||
*/
|
||||
void i2cSendSlaveAddressWrite(i2c_t *i2cHardware, uint16_t *slaveAddress);
|
||||
|
||||
/**
|
||||
* @brief Initiates the communication by sending the slave address on the bus followed by a READ
|
||||
* and waits for an ACK (aknowledge)
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress The address of the slave to be communicated
|
||||
*/
|
||||
void i2cSendSlaveAddressRead(i2c_t *i2cHardware, uint16_t *slaveAddress);
|
||||
|
||||
/**
|
||||
* @brief Sende the register adrres with which we want to communicate.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param registerAddress The register address of the slave device that we are communication with
|
||||
*/
|
||||
void i2cSendRegisterAddress(i2c_t *i2cHardware, uint8_t *registerAddress);
|
||||
|
||||
/**
|
||||
* @brief Send the register that we want to read or write.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param registerAddress the register that need to be accessed
|
||||
*/
|
||||
void i2cSendData(i2c_t *i2cHardware, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Initiates a Write command with the previously set slave address.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cInitiateWriteCommand(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Initiates a read command with the previously set slave address.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cInitiateReadCommand(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Is the output buffer empty. This allso meas that the data that was in the ouput buffer
|
||||
* is sent to the i2c BUS.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cIsOutputBufferEmpty(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Is the output buffer empty. This allso meas that the data that was in the ouput buffer
|
||||
* is sent to the i2c BUS.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cIsInputBufferEmpty(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief reads the I2C input buffer
|
||||
* is sent to the i2c BUS.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param data pointer to the data that need to be read and returned
|
||||
*/
|
||||
void i2cReadInputRegister(i2c_t *i2cHardware, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief writes to the I2C output buffer
|
||||
* is sent to the i2c BUS.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param data pointer to the data that need to be read and returned
|
||||
*/
|
||||
void i2cSetOutputRegister(i2c_t *i2cHardware, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Checks is transfer is complete
|
||||
* is sent to the i2c BUS.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param data pointer to the data that need to be read and returned
|
||||
*/
|
||||
void i2cIsTransferComplete(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Defines the amount of transfers to be made. Address exchange and start conditon does not count
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param count amount o data to be transfered.
|
||||
*/
|
||||
void i2cSetTransferCounter(i2c_t *i2cHardware, uint8_t count);
|
||||
/**************************************************************************************************
|
||||
I2C Communication functions Polling / Blocking Mode
|
||||
***************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte in polling mode as master from from the given devices register.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cMasterRecievePolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
/**
|
||||
* @brief Sends a Single Byte in polling mode as master to the given devices register.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the send command will be sent
|
||||
* @param registerAddress is the regiter to be written to the device
|
||||
* @param data is the data to be sent
|
||||
*/
|
||||
void i2cMasterSendPolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte in polling mide as slave from the given devices register.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cSlaveRecievePolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**
|
||||
* @brief Recieve a Single Byte in polling mode as slave from the given devices register.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
* @param registerAddress is the regiter to be red from the device
|
||||
* @param data is the data whic has been red
|
||||
*/
|
||||
void i2cSlaveSendPolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data);
|
||||
|
||||
/**************************************************************************************************
|
||||
I2C Arbitration Functions for Multymaster mode and slaves clock stretching
|
||||
***************************************************************************************************/
|
||||
void i2cClockSynchronise(); // I2C Standart : Clock Syncronization
|
||||
void i2cAbortTransmit(); // I2c Standart : Stop Communication for multimaster mode
|
||||
void i2cArbitration(); // I2C Standart : Arbitration for multimaster mode to define the right master.
|
||||
void i2cSoftReset(); // I2C Standart : Software reset not supported by all hardware.
|
||||
void i2cBusClear(); // I2C Standart : in case if SCL is stuck
|
||||
|
||||
|
||||
/**************************************************************************************************
|
||||
I2C Extra functions that are not esential for the main functionality
|
||||
***************************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function will scan every for possible addresses to discover devices on the bus.
|
||||
* And write them to the Devices list given to him. This function will not discover more
|
||||
* devices than what he is told.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param devices list where the discevered devices will be written
|
||||
* @param deviceCount Max number of devices to be discovered.
|
||||
*/
|
||||
void i2cDiscoverDevices(i2c_t *i2cHardware, uint16_t *devices, uint8_t deviceCount);
|
||||
|
||||
/**
|
||||
* @brief This function will try to communicate with a device with every speed
|
||||
* allowed by his hardware to find out the maximum communication sppeed possible.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to which the read command will be sent
|
||||
*/
|
||||
i2cSpeed_t i2cTestDeviceSpeed(i2c_t *i2cHardware, uint16_t *slaveAddress);
|
||||
|
||||
/**
|
||||
* @brief This function will read the device info register (if awailable) as follows :
|
||||
* I2c Standart : 3 Bytes (24 bits) | 12 Bits : Manufacturer info | 9 Bits: Part Identification | 3 Bits DIE Rev.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
* @param slaveAddress is the address of the device to be red
|
||||
*/
|
||||
uint32_t i2cReadDeviceInfo(i2c_t *i2cHardware, uint16_t *slaveAddress);
|
||||
|
||||
/**
|
||||
* @brief The selected i2c channel is put on sleep.
|
||||
* @param i2cHardware is the beforehand declared i2c channel with his opperation modes
|
||||
*/
|
||||
void i2cSleep(i2c_t *i2cHardware);
|
||||
|
||||
/**
|
||||
* @brief Error handling.
|
||||
* @param error The error no generated.
|
||||
*/
|
||||
void i2cThrowError(i2c_t *i2cHardware, int16_t error);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _I2C_H_
|
Loading…
Reference in new issue