4

我有一个写入 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;
4

0 回答 0