当我在linux内核版本4.14.98中使用tcan4x5x驱动程序时 出现以下问题
[ 27.788175] tcan4x5x spi0.0: Unsupported version number: 0 [ 28.034275] [<ffff0000087db7f0>] tcan4x5x_can_probe+0x318/0x550 [ 28.085188] [<ffff000009451ecc>] tcan4x5x_can_driver_init+0x18/0x20 [ 28.357443] [<ffff0000087db7f8>] tcan4x5x_can_probe+0x320/0x550 [ 28.408271] [<ffff000009451ecc>] tcan4x5x_can_driver_init+0x18/0x20 [ 28.681485] [<ffff0000087db804>] tcan4x5x_can_probe+0x32c/0x550 [ 28.732311] [<ffff000009451ecc>] tcan4x5x_can_driver_init+0x18/0x20 [ 29.004399] [<ffff0000087db80c>] tcan4x5x_can_probe+0x334/0x550 [ 29.055230] [<ffff000009451ecc>] tcan4x5x_can_driver_init+0x18/0x20 [ 29.088498] tcan4x5x spi0.0: Probe failed, err=-22 [ 29.097673] tcan4x5x: probe of spi0.0 failed with error -22遍历了前面的查询 并做了相应的更改 但是驱动程序返回值-22
看起来错误-22可能与不支持的MCAN IP版本有关 观察到tcan复位后不活动 按如下方式进行重置
(1)Reset GPIO is in low state when system boot up (in DTS file Reset GPIO is configured as ACTIVE HIGH)说明 (2)复位GPIO高60微秒 (3)保持复位后的GPIO低
如何确保TCAN装置启动了?
2.操作说明当TCAN4550最初上电,通过RST引脚复位,或从睡眠状态唤醒时,它将过渡到待机模式。 设备处于这种或任何其他有源模式的最简单的指示是INH引脚的状态。 这是一个电池级的开源输出,意味着使当地电压调节器。 当设备不在低功耗休眠模式时,它将被启用。 要在上电、复位或唤醒事件后开始正常操作,设备将需要通过SPI写入命令从待机模式切换到正常模式(模式控制寄存器h0800,比特7:6)。
如果在发送reset命令后INH没有断言(进入Vsup电位),确保设备在Vsup正常供电。 由于INH是一个开源输出,如果没有到地面的外部泄漏路径存在,那么在取消断言之后,可能需要一些时间才能降至GND电位
要在上电、复位或唤醒事件后开始正常操作,设备将需要通过SPI写入命令从待机模式切换到正常模式(模式控制寄存器h0800,比特7:6) 在tcan4x5x驱动程序中,函数tcan4x5x_init(mcan_class)执行上述操作。 在这个函数下,它设置寄存器h0800
ret = regmap_update_bits ret = regmap_update_bits(tcan4x5x->regmap, TCAN4X5X_CONFIG, TCAN4X5X_MODE_SEL_MASK, TCAN4X5X_MODE_NORMAL); 3. 问题梳理(1)在驱动程序中还有什么要做的改变? 这看起来是正确的,只要SPI接口是响应的,设备就会进入正常模式 接收到SPI模式值为0。 已经检查了SPI引脚,CS, CLK和MOSI有预期的观察结果。 但是MISO pin没有变化,处于低状态。 这种观察是在示波器中进行的。 这些引脚的配置是正确的。
(2)能观察到复位后的INH输出吗? 可以
(3)能读回配置寄存器中的模式控制位的值来确认设备处于正常模式吗? 由于MISO引脚没有响应,因此控制位的值无法读取
(4)当尝试运行该软件时,是否仍然遇到最初的错误? 是的,得到了相同的值
[ 29.088498] tcan4x5x spi0.0: Probe failed, err=-22 [ 29.097673] tcan4x5x: probe of spi0.0 failed with error -22 4. 示波器示图在示波器中检查Power Up时序时,观察到 (1)VIO在FLTR和Vccout出现后上升。 但在数据表图中Power Up Timing,在VIO出现后FLTR和Vccout上升。 这是否会导致上述问题? 既然Vccout和FLTR是模块的输出,为什么两个电压都在VIO电压之前?
(2)一旦CLK稳定,INT不是高提供的电源时间,中断引脚保持低的最初4分钟。 4分钟后,INT变高,VCCOUT和CLK变低。 这是预料之中的吗?(我们为这个INT引脚提供了一个10K的上拉)
5. 现象分析(1)当设备处于待机状态时,Vccout(和VFLT)被启用。 通常,这是INH输出将启用3.3V稳压器的地方,因此Vio可以开始供应。 预计Vccout在设备最初通电后不久就会出现。 注意下图没有显示Vsup和Vio之间的直接关系,因为Vio是由外部源提供的。 指定Vsup变为活动和Vccout变为可用之间的延迟
(2)初始上电后,PWRON中断标志将被设置,导致nINT输出被断言(拉低)。 只有当时钟信号出现时,设备才能访问这种状态。 从示波器的镜头来看,nINT信号在短时间内确实会升高,但上拉电阻太弱,在PWRON复位中断被识别之前,信号被TCAN4550压低。 在待机模式下(未切换到正常模式)休眠4分钟后,TCAN4550将自动进入休眠状态。 当睡眠时,INH输出、Vccout和时钟放大器关闭。 int行也将是高z。 这样做是为了在本地节点没有正确启动的情况下使设备处于最低功耗状态。 为了避免这种睡眠状态,设备必须在初始启动或唤醒的tINACTIVE中通过SPI写入进入正常模。
a. 听起来好像SPI寄存器在启动后没有响应。 这使我相信时钟信号可能有问题,因为这是访问内部SPI寄存器所必需的。
b.设备诊断寄存器(h0000 – h000C)是否可以通过SPI访问?这些寄存器不需要时钟输入就可以访问。 我们无法读取这些值。 寄存器值返回0。
c. 时钟输入到TCAN4550的源是什么? 这是一个晶振还是一个单端时钟输入? 想要的时钟频率是多少?
一个晶振,时钟频率为40MHz
d.捕捉到时钟输入图
注意:时钟是稳定的,直到设备进入睡眠模式(持续4分钟),没有切割。
目前,中断在时钟启动时是高电平,在1毫秒后是低电平 附加捕获FYR
这里的时钟信号看起来不错 看到这一点,诊断寄存器没有响应,我不怀疑这主要是一个时钟问题
也就是说,如果可能的话,建议修改晶体电路,在OSC1(和OSC2)上包括一个串联电阻。 这将允许以后对电路进行调谐。
能否捕捉SPI通信线路的范围镜头,以便确认格式和电气要求在这里得到满足? 包括MOSI, MISO, nCS和SCLK。
希望看到一个SPI帧,同时仍然能够区分个别位的值。 如果具有逻辑分析器功能,那么最好包含已解码的SPI信息
6. 测试记录在注释了下面的代码行之后,观察了SPI信号
File: drivers/spi/spi-imx.c Function: static void spi_imx_buf_rx_swap_u32(struct spi_imx_data *spi_imx) Commented Line: val &= spi_imx->word_mask; Function: static void spi_imx_buf_tx_swap_u32(struct spi_imx_data *spi_imx) Commented Line: val &= spi_imx->word_mask;尝试了以下发送CAN的测试用例, (1)测试用例1:板对板CAN测试
在Board-1: ip link set can0 up type can bitrate 125000 candump can0 在Board-2: ip link set can0 up type can bitrate 125000 cansend can0 123#AABBCCDDBoard-1没有打印从Board-2发送的值。 CANH和CANL显示连续的数据传输。 附上CANH(蓝色)和CANL(黄色)FYR的图片。
(2)测试用例2:M_CAN内部回环测试模式 设置寄存器16h0800[21] = 1和16h0800[0] = 1用于内部环回。 并在一个单板上执行下面的命令
ip link set can0 up type can bitrate 125000 candump can0& cansend can0 123#AABBCCDD在can0中没有收到123#AABBCCDD的值
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:TCAN4550设备驱动调试 https://www.yhzz.com.cn/a/11834.html