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;