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.

[参考译文] TMS320F28335:尝试使用 TMS320F28335从 Holt HI-35850进行标签识别

Guru**** 2392905 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1359074/tms320f28335-trying-to-do-label-recognition-from-holt-hi-35850-with-tms320f28335

器件型号:TMS320F28335

您好!

我们使用 Holt HI-35850器件电路板和 TMS320F28335进行 SPI 通信、

现在我尝试在 HI-35850中使用标号过滤器、

1.我们提供 LabelArray 作为标签查找

UNS16 LabelArray[32]=
{//[0]        [1]        [3 ]    [ 1]     [4]       [5]        [6][7]     
//000-007 008-015 016-023 024-031 032-039 040-047 048-055 056-063
0x0000、  0x0000、0x0000、0x0000、0x0000、 0x0000、0x0000、0x0000
//[8]        [9]      [10]      [11][12][13][14][15]                 
//064-071 072-079 080-087 088-095 096-103 104-111 113-119 120-127
0x0000、  0x0000、0x0000、0x0000、0x0000、 0x0000、0x0000、0x0000
//[16]       [17]    [ 18]      [19]     [20]     [21]    [ 22]    [ 23]
//128-135 136-143 140-151 152-159 160-167 168-175 176-183 184-191
0x0000、  0x0000、0x0000、0x0000、0x0000、 0x0000、0x0000、0x0000
//[24]      [25]      [26]      [27]    [ 28]     [29][30][31]         
//192-199 200-207 208-215 216-223 224-231 232-239 240-247 248-255
0x0100、  0x0000、0x0000、0x0000、0x0000、 0x0000、0x0000、0x0000
};
//C0表示六边形、192表示十进制

2.当我们需要配置控制寄存器时,
(在此配置之前、我们将通过提供"01"操作码进行主复位)

Mcu1_Mcu2_CsLow() Spi_Mcu;
/*写入字节1控制寄存器操作码进行配置*/
Mcu1_Mcu1_Mcu1 Spi_Write (0x1000);
/*用于配置的控制字字节2 */
Mcu1_Mcu1 (0x2000);Spi_Write (0x2000);
/*用于配置的控制字字节3 */
Spi_Write (0x2400);
/*从 MCU2读取虚拟字节1以获得控制字*/
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
/*从 MCU2读取虚拟字节2以获得控制字*/
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
/*从 MCU2读取虚拟字节3以获得控制字*/
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
/*禁用 MCU2 CS 线路*/
Spi_Mcu 2_CsHigh ();

我们使用"10"操作码来写入控制寄存器。 然后、我们将使用 CR5、CR13控制寄存器、
我还添加了 CR2、因为我需要标签识别功能。 因此、我们将提供控制字、即(0x2000)、(0x2400)


3.由于我们需要使用操作码"06"操作码将我的 LabelArray 复制到 Holt 存储器,因此我将这样进行配置。

Mcu1_Mcu2_CsLow() Spi_Mcu;
/*标签的传输操作码*/
Mcu1_Mcu1_Mcu1 (0x0600);Spi_Write (0x0600);
/*为数据字段地址读取虚拟字节*/
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
/*用于将标签阵列复制到 Holt 存储器的循环*/
for (label_index=31;label_index>=0;label_index-)
{
Mcu1_LabelArray[label_index] Spi_Write);
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();


/*禁用 MCU2 CS 线路*/
Spi_Mcu 2_CsHigh ();

4.我们需要使用操作码"0D"读取标签查找存储器

Mcu1_Mcu2_CsLow() Spi_Mcu;
/*读取标签的操作码*/
Mcu1_Mcu1_D00 (Spi_Write);
/*为数据字段地址读取虚拟字节*/
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
/*循环执行虚拟读取*/
for (label_index1=31;label_index1>=0;label_index1--)
{
Mcu1_Mcu1_Mcu1 Spi_Write (0x0000);
READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();

/*禁用 DSC CS 线路*/
Spi_Mcu 2_CsHigh ();

我们将传输0xE01111C0、这里我想检查标签是否为 C0、然后只读取。
由于 C0是十六进制值、它的十进制值是192、因此 AM 设置了192位

199 198 196 195 194 192

0 0 0 0 0 0 0 0 1 =(0x01)

我启用了像这样的192位、并在索引[24]中给出、因为我只需要这个标签。
当我们以这种格式进行尝试时、我无法接收数据。

我还尝试使用操作码"0B"读取控制寄存器

请指导我进行标签筛选。

谢谢。此致、

查亚  

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

    尊敬的 Chaya:

    感谢您提供的信息。 为了澄清问题、我的理解如下(如果我错了、请更正-只是想了解正在发生的事情和您正在尝试做的事情的总体情况):

    • 您正在尝试  在 F28335 (主器件)和 HI35850 (从器件)之间使用 16位字进行通信
    • 您首先从 F28335写入数据到 HI35850、以便发送操作代码来配置 HI35850、而 HI358580  会发回  用于配置 F28335寄存器的控制字(哪些寄存器是用于控制字?)
    • 然后、您从 F28335向 HI35850发送数据以发送另一个操作码、而 HI35850会发回一个虚拟字段地址(此地址用于什么?)
      • 然后将数组(包含32个16位值)发送到 HI358580
    • 您将另一个操作码写入 HI358580、并且 HI35850会发回另一个虚拟字段地址
      • 然后、尝试从 HI35850寄存器中读取一个由32个16位值组成的数组、

    一些问题:

    1.您是否仔细研究了 SPI 线路的范围、以监视所有四条线路在通信期间的行为并检查它们是否有效? 如果不是、请这么做、如果可以的话、请分享一个示波器捕获。 这始终是开始调试 SPI 行为的最佳方法、以确定是否存在硬件、软件或配置问题。

    2.发送 0xE01111C0的时间点是什么? 这是否从 F28335传输到 HI35850? 或者这个数据应该由 F28335接收? 我不清楚为此发生的事件以及您要做什么-您能进一步解释一下吗?

    3.如果无法接收数据、能否逐行分步、同时检查 CCS 中的 RXEMU 寄存器、看看是否正在整个程序中接收数据?

    此致、

    艾里森

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

    您好!

    是的、我们正在尝试使用16位字在 F28335 (主器件)和 HI35850 (从器件)之间进行通信。
    是的、您的理解是正确的。


    问题答案:
    1.是的,我监控了 SPI 线路行为,它们是有效的。 如果我在不选择标签识别的情况下配置控制寄存器
    正确进行发送和接收。

    不带标签识别的控制寄存器的配置:(在进行这个配置的发送和接收时)
    在这里使用控制寄存器 CR5、CR13
    /*启用 MCU2 CS 线路*/
    Mcu1_Mcu2_CsLow() Spi_Mcu;
    /*写入字节1控制寄存器操作码进行配置*/
    Mcu1_Mcu1_Mcu1 Spi_Write (0x1000);
    /*用于配置的控制字字节2 */
    Mcu1_Mcu1 (0x2000);Spi_Write (0x2000);
    /*用于配置的控制字字节3 */
    Mcu1_Mcu1 (0x2000);Spi_Write (0x2000);
    /*从 MCU2读取虚拟字节1以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*从 MCU2读取虚拟字节2以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*从 MCU2读取虚拟字节3以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*禁用 MCU2 CS 线路*/
    Spi_Mcu 2_CsHigh ();

    当我与标签识别一起配置时、接收未完成。

    带有标签识别的控制寄存器的配置:
    寄存器 CR2、CR5、CR13寄存器
    /*启用 MCU2 CS 线路*/
    Mcu1_Mcu2_CsLow() Spi_Mcu;
    /*写入字节1控制寄存器操作码进行配置*/
    Mcu1_Mcu1_Mcu1 Spi_Write (0x1000);
    /*用于配置的控制字字节2 */
    Mcu1_Mcu1 (0x2000);Spi_Write (0x2000);
    /*用于配置的控制字字节3 */
    Spi_Write (0x2400);
    /*从 MCU2读取虚拟字节1以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*从 MCU2读取虚拟字节2以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*从 MCU2读取虚拟字节3以获得控制字*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*禁用 MCU2 CS 线路*/
    Spi_Mcu 2_CsHigh ();

    从 F28335发送到 HI35850。 这应该是由 HI35850收到的。

    我们能够进行标签识别配置的传输和接收。

    3.是的,我试图逐行逐步执行,当时它在这个循环中循环
    仅此用于将 LabelArray 复制到 Holt 存储器的循环。

    它从31号索引开始并变为负数、
    (我们在 Holt 示例中看到过该代码、将在此处附上该文档)


    Mcu1_Mcu2_CsLow() Spi_Mcu;
    /*标签的传输操作码*/
    Mcu1_Mcu1_Mcu1 (0x0600);Spi_Write (0x0600);
    /*为数据字段地址读取虚拟字节*/
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();
    /*用于将标签阵列复制到 Holt 存储器的循环*/
    for (label_index=31;label_index>=0;label_index-)
    {
    Mcu1_LabelArray[label_index] Spi_Write);
    READ_CONFIG_DUMP_MCU2 = Mcu1_Mcu1_Mcu1 Spi_Read ();


    /*禁用 MCU2 CS 线路*/
    Spi_Mcu 2_CsHigh ();

    ***我们看到 RXEMU 寄存器的值是0x0009,表示 FIFO 为空。

    我尝试了将环路值更改为
    for (label_index=0;label_index<=31;label_index++)

    即使这样、我们也无法获得标签筛选器。 但传输正在完成

    e2e.ti.com/.../an_2D00_140_5F00_v_2D00_rev_2D00_d-_2800_1_2900_.pdf

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

    尊敬的 Chaya:

    很高兴听到线路范围的传输/接收看起来是正确的! 这里似乎没有 SPI 配置或 SPI 功能的专门问题-因此这纯粹是让标签正常工作方面的软件问题。  

    遗憾的是、我的专业知识在 SPI 模块中;我不擅长实现这样的标签滤波器、并且对您试图使用它的目的仍然有点困惑。 能否进一步解释一下您是如何实现标签过滤器的,它的作用是什么,以及为什么/如何确定每个数组值的范围?  

    此致、

    艾里森

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

    尊敬的 Allison:  

      是的、我会解释。

    标签筛选器的用途:

    我们之所以使用标签过滤器、是因为我们的 ARINC-429数据具有不同的标签  

    例如:   0xE000FFC6

               0xE01111C0

               0xE000FFC5

    • 这是少数具有不同标签(C6、C0、C5)的 ARIN-429数据
    • 假设我们在 Holt-35850中启用了标签识别功能  
    • 假设我们收到一个 ARINC 数据  (例如: 我们需要标签数据  C0 ),因为我们启用了"标签"筛选器。  
    • 一旦我们接收到 ARINC 数据、如果 Label 是 C0、我们只会将其视为有效数据并进行处理、否则会将其视为无效。

    我们如何实施标签筛选器:  

    在 Holt-35850中、我们有"启用标签识别"功能(CR2是控制寄存器位)。 我们将在配置中配置该位。  

    配置:  

    Mcu1_Spi_Mcu2_CsLow();
    /* write the byte-1 control register opcode for configuration */
    Mcu1_Spi_Write(0x1000);
    /* Control Word byte-2 for configuration */
    Mcu1_Spi_Write(0x2000);
    /* Control Word byte-3 for configuration */
    Mcu1_Spi_Write(0x2400);
    /* Read dummy byte-1 from Mcu2 for control word */
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    /* Read dummy byte-2 from Mcu2 for control word */
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    /* Read dummy byte-3 from Mcu2 for control word */
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    /* Disable Mcu2 CS line */
    Mcu1_Spi_Mcu2_CsHigh();
    

    1.在这里、我们为"Write to Control Register"提供"10"操作码、然后启用控制寄存器位

    • 针对"传输使能模式"的"CR13"位   
    • 用于"自检"的"cr5"位
    • 用于"启用标签识别"的"CR2"位
    • 这就是我们提供(0x2000)和(0x2400)的原因。  

    2.我们还有一些与标签相关的操作码,例如:

    3.配置完成后,我们会传输操作码。 "06"这是将 HI-3585 ARINC 标签选择从标签阵列[]复制到 HI-3585 (将256标签存储器写入 HI-3585)的操作码

    (我们是通过查看 Holt 的示例程序来尝试的)

    Mcu1_Spi_Mcu2_CsLow();
    /* Transmit opcode for label*/
    Mcu1_Spi_Write(0x0600);
    /* Read dummy byte for data filed address */
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    /*for loop to copy label array to holt memory*/
    for(label_index=31; label_index>=0; label_index--)
    {
    Mcu1_Spi_Write(LabelArray[label_index]);
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    
    }
    /* Disable Mcu2 CS line */
    Mcu1_Spi_Mcu2_CsHigh();

    4."0D"操作码用于从 HI-3585读取256个标签存储器  

    Mcu1_Spi_Mcu2_CsLow();
    /* opcode to read label*/
    Mcu1_Spi_Write(0x0D00);
    /* Read dummy byte for data filed address */
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    /*loop to do dummy read */
    for(label_index1=31; label_index1>=0; label_index1--)
    {
    Mcu1_Spi_Write(0x0000);
    read_config_dummy_Mcu2 = Mcu1_Spi_Read();
    }
    /* Disable DSCS CS line */
    Mcu1_Spi_Mcu2_CsHigh();

    阵列:

    UNS16 LabelArray[32] =
    {//[0]      [1]     [2]     [3]      [4]   [5]     [6]       [7]
    //000-007 008-015 016-023 024-031 032-039 040-047 048-055 056-063
    0x0000,   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    // [8]      [9]     [10]    [11]    [12]     [13]   [14]    [15]
    //064-071 072-079 080-087 088-095 096-103 104-111 113-119 120-127
    0x0000,   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    // [16]     [17]    [18]    [19]   [20]     [21]    [22]       [23]
    //128-135 136-143 144-151 152-159 160-167 168-175 176-183 184-191
    0x0000,   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    // [24]    [25]     [26]    [27]    [28]    [29]    [30]    [31]
    //192-199 200-207 208-215 216-223 224-231 232-239 240-247 248-255
    0x0100,   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    };

    1.我们使用16位提供阵列值、因为 F28335是16位处理器。 (即使尝试在数组值中提供8位)

    2.我们在这里设置标签地址192,因为

    3、我们在传输0xE01111C0、这里我想检查标签是否为 C0、然后只处理。

    4. C0为十六进制值、因此它的十进制值为192、所以 AM 设置为192位。 索引24中  

    199 198 196 195 194 192

     0   0 0  0   0 0          0 0   1 =(0x01)   

    e2e.ti.com/.../hi_2D00_35850_5F00_v_2D00_rev_2D00_a.pdf

    谢谢。此致、

    查亚

     

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

    尊敬的 Chaya:

     非常感谢彻底的解释!  请允许我与几位同事讨论一下、如果我们有建议、请在本周晚些时候向您通报最新情况。

    此致、

    艾里森

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

    尊敬的 Chaya:

    我已经讨论过这个问题、很遗憾、我们只能回答有关 C2000中 SPI 模块的问题;有关 Holt 器件任何功能或应用的任何问题都不在 E2E 论坛的讨论范围内、我们无法提供正确的支持。 如果您没有任何特定于 SPI 模块/ SPI 模块的配置问题、那么我们可以继续、关闭该主题。

    此致、

    艾里森

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

    您好!  

    感谢您的支持。  

    实际上、现在我们能够执行标签筛选。  

    1.我们在"06"操作码中有 for 循环

    2.在循环中,我们使用变量。 "label_index"我们声明为 UNS16的这个变量。  

    3、该 for 循环运行的是无限循环。  

    4.我们尝试将 UNS16更改为 IN16或 INT8。 循环不会是无限循环。  

    (对于循环是个问题、标签筛选器的配置相同)

    我们可以关闭该主题。  

    谢谢。此致、

    查亚