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.

[参考译文] TCAN4550:与 CC1352R 的 SPI 连接

Guru**** 2581345 points
Other Parts Discussed in Thread: CC1352R, TCAN4550

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/868212/tcan4550-spi-connection-with-cc1352r

器件型号:TCAN4550
主题中讨论的其他器件:CC1352R

您好! 我尝试使用 CC13x2_26x2 SDK v3.10.01.11的 spimaster 示例在 CC1352R 和 TCAN4550之间设置 SPI 连接。 为了测试连接、我想读取 TCAN4550 0x0000寄存 器、该寄存器包含器件 ID 信息(根据数据表第45页、0x54、0x43、0x41、0x4E)。  

问题是-无论 CC1352R 传输到 TCAN4550的内容是什么、如果 TCAN 打开而不是处于睡眠状态、它总是读取0xc8或0x89值。 因此、有一些响应、但通信方式似乎不正确。 有人可以请求帮助设置 SPI 吗?


代码如下所示:

/*
=== spimaster.c ====
*/
#include 
#include 
#include 

/* POSIX 头文件*/
#include 
#include 
#include 

/*驱动程序头文件*/
#include 
#include 
#include 

/*示例/板头文件*/
#include "Board.h"

#define THREADSTACKSIZE (1024)

#define SPI_MSG_LENGTH (4)

#define MAX_LOOP (10)


静态 Display_Handle 显示;

unsigned char masterRxBuffer[4];
unsigned char masterTxBuffer[4];

//
*=== masterThread ======
*主器件 SPI 在向从器件发送消息的同时从
从器件接收*消息。
//
void * masterThread (void * arg0)
{
SPI_Handle 主 Spi;
SPI_Params Parspiams;
SPI_Transaction 事务;
布尔 转让;

CONST CHAR MASTER_MSG[SPI_MSG_LENGTH]={0x41、0x00、0x00、0x01};

/*将 SPI 作为主器件打开*/
spiParams.frameFormat = SPI_POL0_PHA1;
spiParams.bitrate = 4000000;
spiParams.mode = SPI_MASTER;
SPI_Params_init (&spiParams);
masterSpi = SPI_open (Board_SPI_master、&spiParams);
if (masterSpi == NULL){
Display_printf (display、0、0、"初始化主器件 SPI\n"时出错);
while (1);
}
否则{
display_printf (display、0、0、"Master SPI initialized");
}

strncpy ((char *) masterTxBuffer、master_MSG、SPI_MSG_LENGTH);
memset ((void *) masterRxBuffer、0、SPI_MSG_LENGTH);
transaction.count = SPI_MSG_length;
transaction.txBuf =(void *) masterTxBuffer;
transaction.rxBuf =(void *) masterRxBuffer;

transferOK = SPI_transfer (masterSpi、事务);

if (transferOK){
Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[0]);
Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[1]);
Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[2]);
Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[3]);
}
否则{
display_printf (display、0、0、"主 SPI 传输失败");
}


SPI_CLOSE (masterSpi);

display_printf (display、0、0、"\nDone");

返回(NULL);
}

/*
==== mainThread ====
//
void * mainThread (void * arg0)
{
pthread_t 线程0;
pthread_attr_t attrs;
struct sched_param primParam;
内部 REC;
内部 detachState;

/*调用驱动程序初始化函数。 *
display_init();
GPIO_init();
spi_init();

/*配置 LED 引脚*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_LED1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

/*打开输出的显示屏*/
Display = Display_open (Display_Type_UART、NULL);
if (display =NULL){
/*无法打开显示驱动程序*/
while (1);
}

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

display_printf (display、0、0、"启动 SPI 主设备示例");
display_printf (display、0、0、"此示例要求外部电线为"
"已连接至接头引脚。 有关详细信息、请参阅 Board.html。\n");

/*创建应用程序线程*/
pthread_attr_init (atttrs);

detachState = pthread_create_detached;
/*设置优先级和堆栈大小属性*/
retc = pthread_attr_setdetachstate (&attrs、detachState);
如果(retc!= 0){
/* pthread_attr_setdetachstate()失败*/
while (1);
}

retc |= pthread_attr_setstacksize (&attrs、THREADSTACKSIZE);
如果(retc!= 0){
/* pthread_attr_setstacksize()失败*/
while (1);
}

/*创建主线程*/
priParam.sched_priority = 1;
pthread_attr_setschedparam (&attrs、&priParam);

retc = pthread_create (&thread0、&attrs、masterThread、NULL);
如果(retc!= 0){
/* pthread_create()失败*/
while (1);
}

返回(NULL);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否曾尝试在示波器上查看 SPI 信号? 这对于调试非常有用、因为它可以验证所有硬件连接(以及信号电平和时序等物理层要求)、并验证目标操作是否实际发生(或者是否需要对软件进行一些修复)。

    此致、

    最大

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如果引用 TCAN4550中断寄存器的前8位、则0xC8和0x89共享全局错误和 SPI 错误标志。 由于 TCAN4550会在每次传输的命令阶段(当 nCS 处于活动状态时)传输该寄存器的内容、因此该值可能会写入 CC1352R RXbuffer。 当 TCAN4550在一个 SPI 事务期间未检测到32位的精确倍数(nCS 为低电平)时、可能会发生指示的 SPI 错误。  

    如 Max 所建议的、SPI 线路(SDI、SDO、SCLK 和 NCS)的示波器截图将有助于诊断导致潜在错误或误解的原因。 还可以仔细检查代码中所使用的所有数据长度(我没有看到您共享的数据不匹配)、NCS 在每次传输后变高。

    此致、

    Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    向同事致意!
    感谢您的帮助!

    我已经解决了我的问题。 问题出在消息的长度 SPI。  CC13x2 SDK SPI 库仅允许传输8位或16位数据传输、但 TCAN 4550需要32位数据传输、因此 NCS 引脚在每8位数据传输一次后变为高电平。 因此、TCAN4550会产生误差。 作为权变措施、我使用了另一个引脚而不是 nCS、并在传输前手动将其设置为低电平、在传输后手动设置为高电平。  
    此外、传输仅在极性= 0、相位= 0模式下工作。

    下面列出了我的代码更改。 也许这会对有同样问题的人有所帮助。

    *==== spimaster.c ====
    */
    #include 
    #include 
    #include 
    
    /* POSIX 头文件*/
    #include 
    #include 
    #include 
    
    /*驱动程序头文件*/
    #include 
    #include 
    #include 
    
    /*示例/板头文件*/
    #include "Board.h"
    
    #define THREADSTACKSIZE (1024)
    
    #define SPI_MSG_LENGTH (4)
    
    #define MAX_LOOP (10)
    
    #define HWREG8 (x) \
    (*((volatile uint8_t *)((uint16_t) x))
    
    )静态 Display_Handle 显示;
    
    unsigned char masterRxBuffer[4];
    unsigned char masterTxBuffer[4];
    
    /*
    ===== masterThread ======
    *主器件 SPI 在向从器件发送消息的同时从
    从器件接收*消息。
    //
    void * masterThread (void * arg0)
    {
    SPI_Handle 主 Spi;
    SPI_Params Parspiams;
    SPI_Transaction 事务;
    布尔 转让;
    
    const char msg1[SPI_MSG_LENG]={0x41、0x00、0x00、0x01};
    
    const char msg2[SPI_MSG_LENG]={0x00、0x00、0x00、0x00};
    
    
    /*将 SPI 作为主器件打开(默认)*/
    SPI_Params_init (&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA0;//仅在此模式下工作
    spiParams.bitrate = 2000000;
    masterSpi = SPI_open (Board_SPI_master、&spiParams);
    if (masterSpi == NULL){
    Display_printf (display、0、0、"初始化主器件 SPI\n"时出错);
    while (1);
    }
    否则{
    display_printf (display、0、0、"Master SPI initialized");
    }
    
    睡眠(1);//没有暂停不起作用
    
    strncpy ((char *) masterTxBuffer、msg1、SPI_MSG_LENGTH);
    memset ((void *) masterRxBuffer、0、SPI_MSG_LENGTH);
    transaction.count = SPI_MSG_length;
    transaction.txBuf =(void *) masterTxBuffer;
    transaction.rxBuf =(void *) masterRxBuffer;
    
    GPIO_WRITE (Board_GPIO_LED1、0);//DIO7 (而不是 NCS)变为低电平并激活传输
    
    transferOK = SPI_transfer (masterSpi、事务);
    
    睡眠(1);
    
    
    strncpy ((char *) masterTxBuffer、msg2、spi_MSG_length);
    memset ((void *) masterRxBuffer、0、SPI_MSG_LENGTH);
    transaction.count = SPI_MSG_length;
    transaction.txBuf =(void *) masterTxBuffer;
    transaction.rxBuf =(void *) masterRxBuffer;
    
    transferOK = SPI_transfer (masterSpi、事务);
    
    GPIO_WRITE (Board_GPIO_LED1、Board_GPIO_LED_ON);//DIO7 (而不是 NCS)变为高电平并结束传输
    
    if (transferOK){
    Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[0]);
    Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[1]);
    Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[2]);
    Display_printf (display、0、0、"主设备已接收:%x"、masterRxBuffer[3]);
    }
    否则{
    display_printf (display、0、0、"主 SPI 传输失败");
    }
    
    
    SPI_CLOSE (masterSpi);
    
    display_printf (display、0、0、"\nDone");
    
    返回(NULL);
    } 

    BR。
    Dmitriy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dmitriy、

    感谢您分享您的解决方案! 我很高兴看到您能够找到解决方法。  

    此致、

    Eric