【问题标题】:Sending an 8-byte array to SPI发送一个 8 字节数组到 SPI
【发布时间】:2016-05-30 13:11:57
【问题描述】:

我正在尝试使用 Microchip 的 PIC18F452 设置我的 SPI 通信,以便向总线发送一个 8 字节数组(= 一次传输所有字节)。这是我的数组的示例:

 array   0x0080 byte[8]
array[0] 0x0080  0x01 
array[1] 0x0081  0x01 
array[2] 0x0082  '\0'
array[3] 0x0083  0x01 
array[4] 0x0084  0x01 
array[5] 0x0085  0x01 
array[6] 0x0086  0x01 
array[7] 0x0087  '\0'

这些值来自输入信号(音频文件、时钟等)并在 PORTDbits.RD0 上接收以完成数组。值始终为 1 或 0,仅此而已。

首先,我首先使用 putcSPI() 发送一个字节。当我完成数组时,我向 SPI 发送一个字节,结果是匹配的。

然后,我尝试使用 putsSPI() 一次发送所有字节,如下所示:

/// SEND DATA TO SPI
SPI_INT = 0;     // Enable SS 
putsSPI(array);
SPI_INT = 1;     // Disable SS
delay_ms();      // Delay

但是当我遇到一个 0 时帧的传输停止了(被认为是数组的结尾,所以这是正常的)。而且,我的框架分为块。

例如,对于上面显示的数组,我在 SPI 总线上有“1 1”,然后,下一个值来自随后的帧

话虽如此,我想将数据从二进制转换为十六进制(或整数),然后将其发送到 SPI。 我尝试了这里找到的几种转换方法,但直到现在都没有成功。

有没有办法将整个数组直接发送到总线,或者有没有人知道如何在这种特殊情况下执行转换?

提前非常感谢!

【问题讨论】:

  • 为什么要发送 8 个字节,每个字节只能包含两个值之一?您可以轻松地将值打包到一个字节中。
  • 用完全不同的方法解决了问题。稍后将发布我使用的解决方案
  • 如果putsSPI 需要一个以空字符结尾的字符串,它显然只会发送直到第一个空字符的字符。为什么不一次只发送一个字节?正如@EOF 已经写的那样,8 位是一个字节,您确定不需要只向收件人发送一个字节吗?
  • @Groo 感谢您的回答。正如我在之前的评论中所说,我已经通过从头开始用新想法解决了我的问题
  • @Tealyf:我看到了,但这与问题有很大不同。从一个 8 字节数组到 2 个字节(16 位),它们是“使用计数器修改的”(不是从输入信号接收到的吗?)。您的代码不起作用的原因是因为putsSPI 停止在\0,而WriteSPI 只是向前发送字节,所有其他声明和位操作都无关紧要。

标签: c arrays microchip pic18


【解决方案1】:

最终,为了实现我的目标,我彻底改变了解决这个问题的方法。

我仍然使用 SPI 进行通信。但是,我将输入信号的值(在我应用到它的所有操作之后)保存在一个值中,而不是一个数组。这个值稍后被分成两部分,将一个字节一个字节发送到总线。

// Definition
unsigned int value = 0;
unsigned char value_byte1 = 0; 
unsigned char value_byte2 = 0; 
unsigned int onTheBus_byte1 = 0; 
unsigned int onTheBus_byte2 = 0;

// In main function, the value is modified using a counter (value++;)

// Transfer to SPI
value_byte1 = value >> 8;
value_byte2 = value & 0xFF;

SPI_INT = 0;  // Enable SS 
onTheBus_byte1 = WriteSPI(value_byte1);
onTheBus_byte2 = WriteSPI(value_byte2);
SPI_INT = 1;  // Disable SS

所以,如果我得到:

value = 1505 (= 0x05E1)

在主循环中,然后

value_byte1 = 0x05
value_byte2 = 0xE1

(此代码已在 Proteus 上测试,当值写入总线时,我确实在 SPI 调试器上看到了两个字节)

如果我需要使用该值,比如在另一张图片上,我会在阅读完这两部分后将它们组合起来:

value = (value_byte1 << 8) | value_byte2; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多