我有一个写入 i2c 总线的 i2c 驱动程序:
从机(温度传感器)的寄存器地址
必须写入此地址的值
我还对值进行检查(回读)以确保它是正确的。硬件上一切正常。我在循环环境和单元测试中使用软件,这样我就可以在没有硬件的情况下执行我的代码。为了能够从寄存器读回值,我必须“模拟”数据接收寄存器的内容(从 I2C 从机读回的值)。
因为,我对低级编程不是很有经验,知道在我的情况下如何做到这一点吗?
这是代码片段:
typedef struct
uint8 address; // The register address of the slave
uint8 value; //The value which have to be writte into the register
} MessageStruct;
MessageStruct *pMessage
uint8 Readback = 0;
Write_Toc_I2C( pMessage->address, pMessage->value ); // Function which writes to ic2 bus. For definition see below.
Readback = Read_From_I2c( pMessage->address); // I store the read back value in a variable Readback. Declaration of Read_From_I2c() below
if( Readback == pMessage->value ) /** In this block i perform the check of the red back value. Because this is executed in SIL environment, Readback is 0
{
status = OK;
}
else
{
status = NOT_OK,
}
LOCAL void Write_Toc_I2C( uint8 address, uint8 address ) // Write to I2C Function
{
...
...
...
I2C_HW_Instance()->I2C_DATA_TRANSMIT_REGISTER = address;
I2C_Block_For_Event(I2C_DATA_TRANSMIT_READY); /*I2C_DATA_TRANSMIT_READY is the status flag*/
I2C_HwInstance()->I2C_DATA_TRANSMIT_REGISTER = value;
I2C_Block_For_Event(I2C_DATA_TRANSMIT_READY); /*I2C_DATA_TRANSMIT_READY is the status flag*/
I2C_HwInstance()->I2C_MODE_REGISTER = I2C_STOP;
}
Read_From_I2c( uint8 address ) // Read from I2C Function
{
...
...
I2C_HW_Instance()->I2C_DATA_TRANSMIT_REGISTER = address;
I2C_Block_For_Event(I2C_DATA_TRANSMIT_READY);
...
...
...
I2C_Block_For_Event(I2C_RECEIVE_REGISTER);
return ((uint8) I2C_HwInstance()->I2C_DATA_RECEIVE_REGISTER);
}
static inline I2C_Base_Register *I2C_HW_Instance( void )
{
static I2C_Base_Register *pToBaseReg;
#if (UTEST == ON)
{
static I2C_Base_Register BaseReg;
pToBaseReg = &BaseReg;
}
#else
pToBaseReg = (I2C_Base_Register *)Register_Of_I2c_Adress;
#endif
return (pToBaseReg);
}
static inline void I2C_Block_For_Event( i2cStatusFlag evt )
{
#if !defined(__SIL__) // Software in the Loop
while((i2c_HwInstance()->I2C_INTERRUPT_STATUS_REGISTER & evt) == 0)
{};
#elif defined UTEST || __SIL__
// hmmm, what to do?
#endif
typedef volatile struct I2C_BASE
{
// Here are the registers listed, there are 32, but I listed only the relevant one
uint8 I2C_DATA_RECEIVE_REGISTER; /*I2C Data Receive register */
uint8 I2C_DATA_TRANSMIT_REGISTER; /*I2C Data Transmit register */
uint32 I2C_MODE_REGISTER; /*0x0024 I2C Mode register */
uint32 I2C_INTERRUPT_STATUS_REGISTER; /*0x0008 I2C Interrupt Status register */
} I2C_Base_Register;