我正在尝试使用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。 我在这里尝试了几种转换方法,但直到现在还没有成功。
是否有解决方案将整个阵列直接发送到总线,或者有人知道如何在这种情况下执行转换?
非常感谢提前!
答案 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;