如何得到动态地址?MSTAUS值保持不变如何解决?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

如何得到动态地址?MSTAUS值保持不变如何解决?

6,941 Views
melanie
Contributor III

Hi

当程序运行到mstatusVal = I3C->MSTATUS时,无法跳出循环。

mstatusVal=0x9223

请问这是什么原因导致?

具体代码如下

enum I3C_COMM_STATUS i3c_ccc_entdaa_b(uint8_t *data8B, uint8_t dynamic_address)
{
/* clear flags */
i3c_ccc_errwarn_status_clear();

/* emit entdaa request */
I3C->MCTRL = I3C_MCTRL_REQUEST(kI3C_RequestProcessDAA);

/* wait state = 5, between = 1, mctrldone = 1 */
do {
mstatusVal = I3C->MSTATUS;
} while (((mstatusVal & I3C_MSTATUS_STATE_MASK) != I3C_MSTATUS_STATE(kI3C_MasterStateDaa)) ||
((mstatusVal & I3C_MSTATUS_BETWEEN_MASK) != I3C_MSTATUS_BETWEEN(1)) ||
((mstatusVal & I3C_MSTATUS_MCTRLDONE_MASK) != I3C_MSTATUS_MCTRLDONE(1)));

/* copy 8 byte data from ENTDAA process */
for (int i = 0; i < 8; i++)
data8B[i] = (uint8_t)I3C->MRDATAB;

0 Kudos
19 Replies

6,816 Views
kerryzhou
NXP TechSupport
NXP TechSupport

楼主你好!

我刚私信你了,如果有任何更新,建议你用英文新建case,我们同事会帮你解答:

1. Open below SUPPORT site, click blue "Go to Tickets" in the middle.
http://www.nxp.com/support/support:SUPPORTHOME

2.Then you will be requested to Login, if you have no an account, please first Register with your business email.

3.After login, please "Create New Cases" button in the middle, then you can submit your question.

谢谢你的理解!

Best Regards,

kerry

0 Kudos

6,934 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi @melanie ,

   楼主你好! 

   单单看你的mstatusVal=0x9223 无法跳出循环,主要是两个条件没满足:

((mstatusVal & I3C_MSTATUS_STATE_MASK) != I3C_MSTATUS_STATE(kI3C_MasterStateDaa)) ||
((mstatusVal & I3C_MSTATUS_BETWEEN_MASK) != I3C_MSTATUS_BETWEEN(1))

也就说,你的状态并没有得到DAA反馈,所以我觉得你要检查下的I3C从机,是否支持DAA?

 我们RT600不是有I3C主从机代码在SDK中吗?你如果有两个板子,可以一个当主机一个当从机去测,然后抓一波I3C ENTDAA的波形去看下,然后对比下你现在这个从机的情况,我看下来,应该是你的从机没有相应ENTDAA命令,不知道你的从机是否能支持。

ENTDAA波形应该是像这个样子的:

kerryzhou_0-1661829942417.png

你看看,是不是你的从机就不反馈了。

Best Regards

Kerry

 

0 Kudos

6,917 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的回复。

从机是支持I3C协议的。

从机为什么会不响应I3C协议呢?根据我抓的波形图看,从机对于7E地址是不响应的

0 Kudos

6,912 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi @melanie ,

    好像看你回复了几个,后来删了。

   你现在下载没问题了吧?如果遇到之前可以工作,后面不能工作,你可以尝试把外部flash内容先擦下,然后应该就可以,主要问题,可能是下载过程中出问题,导致不能boot,就会导致下载的问题。

  关于I3C,我看你删掉的内容里面说,之前可以工作,现在不可以工作,是之前I3C可以工作,但是突然不能工作了嘛?你还有没有其他同样的I3C从机,换个同样的看看,是否能够响应。

  另外看看,抓取的波形,频率,电压高度等,是否满足你从机的情况。

  如果你有MIMXRT685-AUD的板子就好了,那个板子就能直接测试,直接看波形了。

 

Best Regards,

Kerry

0 Kudos

6,907 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的回复

melanie_0-1661846213620.png

通过上图所示的方法擦除Flash后依然和之前一样,没有多的从机。

之前在你的帮助下可以将SDK导入RT685中,可以运行。

但是,现在无法运行。我抓了波形图,SDA和SCL均为高。应该是空闲模式,电压,以及电压纹波是正常的。就是卡在总线状态检测那里

0 Kudos

6,903 Views
kerryzhou
NXP TechSupport
NXP TechSupport

好的,你先不急!

1. 如果擦除flash,你这么干,进入serial download模式, 就是Serial ISP模式,SW5修改。

kerryzhou_1-1661847060873.png

kerryzhou_2-1661847072473.png

 

 

然后你再用MCUBootUtility去擦,这个工具超级好用。

https://github.com/JayHeng/NXP-MCUBootUtility/releases/tag/v3.5.0
the related user manual is:
https://github.com/JayHeng/NXP-MCUBootUtility

kerryzhou_0-1661846919855.jpeg

注意下,这个你USB口你要接到RT685的USB口那边,并不是调试口 USB。

 

2. 之前可以将SDK导入RT685中,可以运行。

可以给更具体的情况嘛?是说之前I3C工作都正常了,但是现在突然不正常了嘛?

我是想知道你的这个从机正常工作过没有。

抓了波形图,SDA和SCL均为高,主机发的波形是否能发到总线呢?

 

Best Regards,

Kerry

 

 

 

0 Kudos

6,899 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的回复,我会根据你说的重新擦除。

2. 之前可以将SDK导入RT685中,可以运行。

可以给更具体的情况嘛?是说之前I3C工作都正常了,但是现在突然不正常了嘛?

我是想知道你的这个从机正常工作过没有。

从机之前正常运行过一次,可以通过串口打印出数据,以及可以检测到IBI中断。未采集正常运行下的时序图。

目前从机无法运行, result = I3C_CheckForBusyBus(base);该代码返回值错误。程序采集时序图发现SDA与SCL一直保持高电平。

0 Kudos

6,890 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你的从机是外接的,对吗?

你这样测试试试,主机进入debug,先不发数据,然后把从机的电断一下,再插上,还有就是你的I3C要有上拉,然后debug跑起来,你再测看看,最起码主机的波形应该有的。

你可以把你的I3C波形也发上来看看。

如果动态分配地址都没成功,说明主机没工作,你再检查下频率,是不是从机能接收的,可以降点频率看看。

Best Regards,

Kerry

 

0 Kudos

6,833 Views
melanie
Contributor III

Hi @kerryzhou 

 

请问I3C_MasterGetDefaultConfig(&masterConfig)之前,I3C->MSTATUS=0x1000;

 

melanie_0-1662026702497.png

经过I3C_MasterGetDefaultConfig(&masterConfig)之后,I3C->MSTATUS=0x1101;

这是为什么呀,这里哪个操作使得Slave要去拉低SDA?实际测试电压并未拉低、

0 Kudos

6,817 Views
kerryzhou
NXP TechSupport
NXP TechSupport

楼主你好!

我看了你的波形,还是怀疑你的slave不工作,正常的ENTDAA是这样的流程:

kerryzhou_0-1662090292976.png

包括我之前发的我测的波形给你也说明了:

kerryzhou_1-1662090310374.png

但是你看你的波形:

kerryzhou_2-1662090330805.png

广播对你的slave无效,你的slave不ACK,所以主机测不下去了,就报问题了。

你有办法证明你的slave 能接收ENTDAA吗?就是你的外部sensor电路能工作。

如果可以,我建议你找个MIMXRT685-AUDIO-EVK,那样会对你帮助更大,毕竟那个板子结合我们官方SDK绝对能跑通的。

这样你也可以有个对比。

关于I3C_MasterGetDefaultConfig,其实也就是做一些默认配置:

void I3C_MasterGetDefaultConfig(i3c_master_config_t *masterConfig)
{
masterConfig->enableMaster = kI3C_MasterOn;
masterConfig->disableTimeout = false;
masterConfig->hKeep = kI3C_MasterHighKeeperNone;
masterConfig->enableOpenDrainStop = true;
masterConfig->enableOpenDrainHigh = true;
masterConfig->baudRate_Hz.i2cBaud = 400000U;
masterConfig->baudRate_Hz.i3cPushPullBaud = 12500000U;
masterConfig->baudRate_Hz.i3cOpenDrainBaud = 2500000U;
}

然后关键是对I3C做初始化:

I3C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Hz.i2cBaud = EXAMPLE_I2C_BAUDRATE;
masterConfig.baudRate_Hz.i3cPushPullBaud = 12500000U;
masterConfig.baudRate_Hz.i3cOpenDrainBaud = 4000000U;
masterConfig.enableOpenDrainStop = false;
I3C_MasterInit(EXAMPLE_MASTER, &masterConfig, I3C_MASTER_CLOCK_FREQUENCY);

这块是没有问题的,问题主要还是你从机不响应,不ACK,看着压根不工作。

 

Best Regards,

Kerry

 

 

 

0 Kudos

6,869 Views
melanie
Contributor III

Hi @kerryzhou 

1. 我用你提供的工具,重新擦除Flash。然后,重新烧录demo进去。

2. 在执行MAIN函数之前,将从机进行重新上电。

3.之前设置的BAUDRATE 460800  现在更改为BAUDRATE 9600

4, 关于你说的上拉,我将J18 PIN3PIN4短接。之前没有用连接。

程序依旧无法运行

时序图如下

 

melanie_0-1661920526335.png

 

0 Kudos

6,867 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi @melanie ,

 你这个波形不对啊,怎么连主机发的数据都没有的?

 是抓取问题嘛?有没有搞触发的,时钟作为触发,然后再抓下,时间深度高一点。

 如果还是抓不到,你把从机拔掉,按道理也有波形的。

 

Best Regards,

kerry

0 Kudos

6,860 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的回复

目前直接从RT685抓数据也不稳定,现在也抓不到任何信号,均保持高电平

 

0 Kudos

6,857 Views
kerryzhou
NXP TechSupport
NXP TechSupport

你逻辑分析仪,用时钟下降沿触发了嘛?

1.确定工具你用溜了

2. 确定测试点是对的

你把你测试点拍个照片给我看看。把原理图的点也画给我。

3. 测试点和代码匹配

  你现在代码是RT685-AUDIO得I3C sensor代码,除了FCB和下载flashdriver,其他没变对吧?

我帮你看看。

4. 你现在用的sensor是和RT685-AUDIO的芯片sensor一样嘛?

ICM-42688-P

kerryzhou_0-1661938277222.png

sensor外围电路对不对?

 

Best Regards,

Kerry

 

0 Kudos

6,853 Views
melanie
Contributor III

Hi @kerryzhou 

1,逻辑分析仪确定没有问题,IDE不熟

2,测试点我确定是对的。(测试时,J18 PIN3 PIN4的跳帽未连接。其他所有跳帽均按默认连接)

melanie_1-1661939330666.png

 

sensor 和逻辑分析仪接地的位置

melanie_2-1661939387378.png

用3V3给sensor供电

melanie_3-1661939439685.png

sensor VDDIO 经过3V3转1V8 LDO电路转换供电。VDDIO=1V8

melanie_4-1661939617325.png

目前没法拍实际的,但是确定连线没问题。后续可以补上

3,现在代码是RT685-AUDIO得I3C sensor代码,除了下载flashdriver改变了其他未变.请问FCB需要改动什么?

4,sensor 一样的

 

 

0 Kudos

6,851 Views
kerryzhou
NXP TechSupport
NXP TechSupport

问个问题,你现在代码是下到内部RAM运行还是flash?

修改点就是我之前告诉你的:

https://community.nxp.com/t5/i-MX-RT/Could-you-shre-some-demo-of-I3C/m-p/1513681#M21348

FCB就是flash_config.c内容修改为MIMXRT685-EVK 对应的flash_config.c代码。

你应该改过了。

如果直接跑RAM,debug,你都不需要改flash相关内容。

 

我现在很奇怪,你主机压根没出波形,我马上再仔细看看用的引脚错了没有。

你现在如果进入debug,I3C初始化之后,SCK, DATA都是高的吗?

还有按道理,最起码能发波形出来,就算不接sensor,但是你那边没波形就奇怪了。

示波器有测过吗?电压高度对不对,有没有波形闪过,或者触发出来。

 

0 Kudos

6,838 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的支持。

 

I3C_MasterInit(EXAMPLE_MASTER, &masterConfig, I3C_MASTER_CLOCK_FREQUENCY);
此时I3C->MSTATUS=0X1101;

I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL);

i3c_register_ibi_addr_t ibiRecord = {.address = {SENSOR_ADDR}, .ibiHasPayload = true};
I3C_MasterRegisterIBI(EXAMPLE_MASTER, &ibiRecord);

PRINTF("\r\nI3C master do dynamic address assignment to the sensor slave.\r\n");

uint8_t addressList[1] = {SENSOR_ADDR};
uint32_t enabledInts = I3C_MasterGetEnabledInterrupts(EXAMPLE_MASTER);

此时I3C->MSTATUS=0X1001;

result= I3C_MasterProcessDAA(EXAMPLE_MASTER, addressList, sizeof(addressList));

进入3C_MasterProcessDAA函数中,

因为总线一直处于BUSY,所以用I3C_MasterGetState获取总线状态,得到kI3C_MasterStateSlvReq。

想通过I3C_MasterStart函数强制START, 但是未成功。

此时I3C->MSTATUS=0X1edc.

请问I3C Mstaus 为什么会改变成0X1edc这个值?

如下图所示的bit, 为什么是MSGDDR

melanie_0-1662022027692.png

 

0 Kudos

6,848 Views
melanie
Contributor III

Hi @kerryzhou 

谢谢你的回复

现在下载在flash,   flash_config.c内容修改为MIMXRT685-EVK 对应的flash_config.c代码。

SDA SCL电压确定是对的,我量过。

你现在如果进入debug,I3C初始化之后,SCK, DATA都是高的吗?

是的均为高电平

不接sensor最多发一个7E广播地址,其他看不到。而且不是每次都能测到广播地址。我给你附了时序图在上一个回复里。

未用示波器测,需要的话,我找仪器测试一下。

 

 

 

0 Kudos

6,862 Views
melanie
Contributor III

Hi @kerryzhou 

去掉从机抓取数据,直接抓取

melanie_0-1661933875486.png

从机连接依然是无信号

0 Kudos