公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

我正在使用AURIX™ IFX 低级EVAL_BDPS_DRIVER 库 (iLLD) 版本 iLLD_1_0_1_17_0 开发 TC387 微控制器。我无法在从模式下配置 I2C 引脚 ifxi2c0_scl_p15_4_inout 和 ifxi2c0_sda_p15_5_inOUT。 我在配置文件中将外围模式设置为从机模式。

i2cConfig.peripheralMode = IfxI2c_MasterNotSlave_slave;
if (config->peripheralMode == IfxI2c_MasterNotSlave_slave)
{
   IfxI2c_configureAsSlave(i2cSFR);
} 

但是,这个 configureAsSlave 函数是在 ifxi2c.c 中定义的 文件,实际上是将其设置回主模式。

void IfxI2c_configureAsSlave(Ifx_I2C *i2c)
{
   i2c->ADDRCFG.B.MNS = 1; // master mode
}

我在这里将位更改为 0 以将其配置为从属模式。 它没有奏效。 我已经为地址匹配启用了协议中断源,但是 I2C 从未收到过这个中断。

IfxI2c_enableProtocolInterruptSource(i2cSFR, IfxI2c_ProtocolInterruptSource_addressMatch);

我的代码就在这里等待地址匹配...

// Wait until i2c master sends a read request
while (IfxI2c_getProtocolInterruptSourceStatus(i2c, IfxI2c_ProtocolInterruptSource_addressMatch) == FALSE)
{}
IfxI2c_clearProtocolInterruptSource(i2c, IfxI2c_ProtocolInterruptSource_addressMatch);

任何有关如何在 I2C 从机模式下运行协议中断的见解都会非常有帮助。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/Aurix-tc387-I2C-Slave-mode-not-working/td-p/680963

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

@anwar

这是这个版本的 iLD (1_0_1_17_0) 中的一个错误,我会报告的。

iLLD I2c EVAL_BDPS_DRIVER 为主模式下的 8 位宽数据传输提供默认配置。 Slave 的配置非常相似,你可以这样设置:

 

void IfxI2c_configureAsSlave(Ifx_I2C *i2c)
{
    // enter config Mode
    IfxI2c_stop(i2c);

    i2c->ADDRCFG.U      = 0;
    i2c->ADDRCFG.B.MNS  = 0; // slave mode
    i2c->ADDRCFG.B.SONA = 0; // don't release the bus on NACK
    i2c->ADDRCFG.B.SOPE = 0; // after transfer go into master restart state
    i2c->ADDRCFG.B.TBAM = 0; // 7 bit address mode
    i2c->FIFOCFG.U      = 0;
    i2c->FIFOCFG.B.TXFC = 1; // FIFO as flow controller
    i2c->FIFOCFG.B.RXFC = 1; // FIFO as flow controller
    i2c->FIFOCFG.B.TXBS = 0; // Burst size 1 word
    i2c->FIFOCFG.B.RXBS = 0; // Burst size 1 word
    i2c->FIFOCFG.B.TXFA = 0; // fifo is byte aligned
    i2c->FIFOCFG.B.RXFA = 0; // fifo is byte aligned
}

 

对于中断,您还需要使用以下功能启用中断和标志:

 

// enable the protocol interrupt flag
IfxI2c_enableProtocolInterruptFlag(Ifx_I2C *i2c);

// enable the protocol interrupt
IfxI2c_enableProtocolInterrupt(i2c, IfxSrc_Tos_cpu0, 8);

 

您可以在 iLLD 文档中找到有关此 EVAL_BDPS_DRIVER 的更多信息。 若要获取文档,可以从 此 6EDL_SPI_LINK 获取文档,也可以按照此 知识 TLE9243QK_BASE_BOARD 文章进行操作。 在那里你可以去模块->iLLD->I2C->如何使用I2c EVAL_BDPS_DRIVER?

最诚挚的问候,

埃里克

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/Aurix-tc387-I2C-Slave-mode-not-working/m-p/683833

在原帖中查看解决方案

0 点赞
1 回复
Translation_Bot
Community Manager
Community Manager
Community Manager

@anwar

这是这个版本的 iLD (1_0_1_17_0) 中的一个错误,我会报告的。

iLLD I2c EVAL_BDPS_DRIVER 为主模式下的 8 位宽数据传输提供默认配置。 Slave 的配置非常相似,你可以这样设置:

 

void IfxI2c_configureAsSlave(Ifx_I2C *i2c)
{
    // enter config Mode
    IfxI2c_stop(i2c);

    i2c->ADDRCFG.U      = 0;
    i2c->ADDRCFG.B.MNS  = 0; // slave mode
    i2c->ADDRCFG.B.SONA = 0; // don't release the bus on NACK
    i2c->ADDRCFG.B.SOPE = 0; // after transfer go into master restart state
    i2c->ADDRCFG.B.TBAM = 0; // 7 bit address mode
    i2c->FIFOCFG.U      = 0;
    i2c->FIFOCFG.B.TXFC = 1; // FIFO as flow controller
    i2c->FIFOCFG.B.RXFC = 1; // FIFO as flow controller
    i2c->FIFOCFG.B.TXBS = 0; // Burst size 1 word
    i2c->FIFOCFG.B.RXBS = 0; // Burst size 1 word
    i2c->FIFOCFG.B.TXFA = 0; // fifo is byte aligned
    i2c->FIFOCFG.B.RXFA = 0; // fifo is byte aligned
}

 

对于中断,您还需要使用以下功能启用中断和标志:

 

// enable the protocol interrupt flag
IfxI2c_enableProtocolInterruptFlag(Ifx_I2C *i2c);

// enable the protocol interrupt
IfxI2c_enableProtocolInterrupt(i2c, IfxSrc_Tos_cpu0, 8);

 

您可以在 iLLD 文档中找到有关此 EVAL_BDPS_DRIVER 的更多信息。 若要获取文档,可以从 此 6EDL_SPI_LINK 获取文档,也可以按照此 知识 TLE9243QK_BASE_BOARD 文章进行操作。 在那里你可以去模块->iLLD->I2C->如何使用I2c EVAL_BDPS_DRIVER?

最诚挚的问候,

埃里克

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/Aurix-tc387-I2C-Slave-mode-not-working/m-p/683833

0 点赞