向SPI发送一个8字节的数组

时间:2016-05-30 13:11:58

标签: c arrays microchip pic18

我正在尝试使用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。 我在这里尝试了几种转换方法,但直到现在还没有成功。

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

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

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

我仍然使用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;