向 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;
我正在尝试设置与 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;