线程中讨论的其他部件:TMS320F28.0025万C, TCAN1145-Q1, USB2ANY
我们将TCAN1145-Q1与TI DSP TMS320F28.0025万C一起使用。 我们希望示例代码相同。 从哪里可以获得使用SPI配置TCAN IC的示例代码?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我们将TCAN1145-Q1与TI DSP TMS320F28.0025万C一起使用。 我们希望示例代码相同。 从哪里可以获得使用SPI配置TCAN IC的示例代码?
您好,Yogini:
请向我发送电子邮件,请求TCAN1145的示例c驱动程序。 您可以通过单击我的姓名在我的E2E个人资料中找到我的地址。
此设备的默认状态为待机模式,其中CAN收发器未激活。 要评估CAN收发器,需要使用SPI将设备移至正常模式。
EVM还内置了一个MCU,可简化类似此类的简单配置。 您可以使用标准USB2ANY接口直接发送SPI消息,或使用以下链接在线提供的专用TCAN114x GUI,通过PC上的USB连接快速配置IC。
https://dev.ti.com/gallery/view/TCAN114x/TCAN114x/ver/1.0 .0/
如果您对代码或GUI有疑问,请告诉我。
此致,
Eric Schott
您好Eric,
现在,我尝试将TCAN连接到我的控制器TMS320F28.0025万c。 I已连接4个SPI连接和CAN Tx Rx引脚。
为TCAN供电,我只使用USB,与以前的连接相同。 但使用这些连接,我无法使用GUI连接到tcan。
我是否需要为TCAN提供外部电源,而不是使用USB为其供电? (使用外部控制器时?)
此外,我可以从何处设置TCAN的SPI数据速率? 我无法在数据表中获取注册信息。
在tcan init中,我只是将tcan集成电路设置为正常模式。我应该如何初始化tcan,只能通过SPI和CAN (500K波特率)进行通信?
您好,Yogini:
TCAN1145的SPI接口用于配置和模式控制。 这可以通过GUI进行快速评估,也可以通过MCU的SPI端口来更紧密地模拟应用程序或测试代码。 TXD和RXD引脚用于直接与CAN总线(CANH/CANL)连接的CAN数据。 由于GUI只能访问SPI引脚,因此CAN数据需要来自其他设备(MCU或信号发生器)。 我不建议尝试从GUI和外部MCU控制SPI。 SPI只能使用其中一个。
TCAN1145需要提供Vsup才能在任何模式下工作。 在活动模式(正常和侦听)下,也需要Vcc和Vio。 EVM上的USB只能通过J2配置为Vio提供3.3V电压。 建议使用非板载电源为EVM提供Vsup和Vcc。 如果收发器连接到MCU,Vio应与MCU的IO共享相同的电压(这就是为什么USB提供3.3V电压以与板载MCU共享)。
由于SPI是同步数据协议,SCLK信号为TCAN1145的SPI接口提供时钟源。 无需设置TCAN1145的SPI速率。 SPI数据速率必须在收发器的工作范围内(最大4MHz)。
此致,
Eric Schott
您好Eric,
感谢您的详细说明。 这确实有助于我取得进步。
现在,我已使用TMS320F28.0025万C将外部电源连接到TCAN EVM和SPI连接。
我只尝试使用SPI读取TCAN的模式,如果不是正常模式,也尝试写入模式。
但是缺少了一些东西。 我得到了意想不到的价值。 下面是我的代码。 如果缺少任何内容,请告诉我。
要读取模式:
uint16_t tData;uint8_t intRegister = 0;uint8_t *data;uint8_t address = 0x10;
while(SPI_isBusy(SPIA_BASE));SPI_readDataNonBlocking(SPIA_BASE);SPI_writeDataBlockingNonFIFO(SPIA_BASE, (uint16_t)0x00);SPI_writeDataBlockingNonFIFO(SPIA_BASE, (uint16_t)(address << 1)); // 0 for read((address << 1)|0x01)
SPI_writeDataBlockingNonFIFO(SPIA_BASE, (uint16_t)0x00); // Feed dummy zeros for readSPI_writeDataBlockingNonFIFO(SPIA_BASE, (uint16_t)0x00);while(SPI_isBusy(SPIA_BASE));tData = SPI_readDataNonBlocking(SPIA_BASE); // Pull first byteintRegister = (uint8_t)(tData & 0xFF);tData = SPI_readDataNonBlocking(SPIA_BASE); // Pull first byte*data = (uint8_t)(tData & 0xFF);
您好,Yogini:
我很高兴听到事情朝着正确的方向发展
我不是直接熟悉SPI驱动程序,但从较高的层面来看,这看起来是正确的。 您正正确地在寄存器字节上移动,并在最低有效位中保留0以指示读取。 伪零可以为TCAN1145创建SCLK脉冲,以返回寄存器0x10和0x11中的数据(溢出字节将扩展到下一个寄存器)。 如果不知道您提取的数据的结果,很难评论是否成功。
我要提到的几件事是:确保您已配置SPI以使用正确的芯片选择和串行时钟极性。
TCAN1145使用负极性进行芯片选择(NCS),并在NCS被拉低时激活。 NCS再次变高时,这表示SPI事务结束。NCS在每个SPI事务(读或写)之间必须变高,但对于扩展读/写命令可以保持较低。
TCAN1145使用SCLK的上升沿对SDI上的SPI数据进行采样,并更改SCLK下降沿上的SDO数据。 确保SPI控制器配置为使用此相同类型的逻辑,否则可能会在设备之间获取垃圾数据。
此致,
Eric Schott
此外,如果我尝试使用下面的代码来突发读取3个字节,则每个数据值只得到0x54。
//multiple register read while(SPI_isBusy(SPIA_BASE)); SPI_writeDataBlockingNonFIFO(SPIA_BASE, (uint16_t)(address << 1)); // 0 for read while(SPI_isBusy(SPIA_BASE)); tData = SPI_readDataBlockingNonFIFO(SPIA_BASE); // Pull first byte intRegister = (uint8_t)(tData & 0xFF);
uint8_t i = 0; for (i=0; i < 3; i++) { SPI_writeDataBlockingNonFIFO(SPIA_BASE, 0x10); // Feed dummy zeros for read while(SPI_isBusy(SPIA_BASE)); tData = SPI_readDataBlockingNonFIFO(SPIA_BASE); // Pull data byte datab[i] = (uint8_t)(tData & 0xFF); }
while(SPI_isBusy(SPIA_BASE));
您好,Yogini:
我同意,听起来收发器只看到0x00作为地址,因此返回device_ID值。 抱歉,我不熟悉SPI驱动程序,因此我认为除了在高级别调试代码之外,我对调试代码没有多大帮助。 我的建议是将示波器或逻辑分析仪连接到SCLK,SDO和SDA线路,并监控SPI帧。 这将使您能够将对应于物理SPI操作的函数调用关联起来。 这还有助于您检查并查看帧的格式是否符合TCAN1145数据表中显示的要求。
此致,
Eric Schott
您好,Yogini:
当t > tSILENCE没有CAN活动时,SWE计时器启动。 一旦SWE计时器(~4分钟)到期,收发器将自动切换至休眠模式。 默认情况下(CANSLNT_SWE_DIS = 1),任何CAN活动都将清除tSILENCE计时器并重置SWE计时器。 这意味着在收发器自动进入休眠状态之前,CAN通信需要完全间隔4分钟。 tSILENCE中断也可以通过SPI手动清除,以防止收发器再进入休眠状态~4分钟。
这些计时器的实际时间(0.6s - 1.2s,3.75min - 5min)不可配置。 它们由设备指定,并且提供的范围涵盖所有工作条件下的内部时钟行为。
此致,
Eric Schott