向 SPI 发送一个 8 字节数组

Sending an 8-byte array to SPI

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

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

这些值来自输入信号(音频文件、时钟等)并在 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。 我已经尝试了这里找到的几种转换方法,但到现在为止 none 已经成功了。

是否有将整个数组直接发送到总线的解决方案,或者有人知道如何在这种特殊情况下执行转换吗?

非常感谢!

最终为了达到我的目的,我彻底改变了我的方法来解决这个问题。

我仍然使用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 调试器上看到了两个字节)

如果我需要使用该值,请在另一张图片上说,我 assemble 阅读完后的两部分:

value = (value_byte1 << 8) | value_byte2;