void SPI_WriteByte(Uint16 byte) { Uint16 i; // 拉低片选信号 GpioDataRegs.GPBCLEAR.bit.SPI_CS = 1; asm(" RPT #10 ||NOP"); // 循环发送8位数据 for (i = 0; i < 8; i++) { // 将数据的最高位写入MOSI引脚 if (byte & 0x80) { GpioDataRegs.GPBSET.bit.SPI_MOSI = 1; } else { GpioDataRegs.GPBCLEAR.bit.SPI_MOSI = 1; } asm(" RPT #20 ||NOP"); // 拉高时钟信号 GpioDataRegs.GPBSET.bit.SPI_CLK = 1; asm(" RPT #80 ||NOP"); // 拉低时钟信号 GpioDataRegs.GPBCLEAR.bit.SPI_CLK = 1; asm(" RPT #80 ||NOP"); // 将数据的最高位移出 byte <<= 1; } } 这段代码是向spi写入一个字节的数据,我如何把它改成每次写入16位呢,相对应的读函数我又该怎么改
时间: 2024-03-16 10:47:00 浏览: 112
要改成每次写入16位,需要修改循环次数和数据的移位操作。具体实现如下:
```
void SPI_WriteWord(Uint16 word) {
Uint16 i;
// 拉低片选信号
GpioDataRegs.GPBCLEAR.bit.SPI_CS = 1;
asm(" RPT #10 ||NOP");
// 循环发送16位数据
for (i = 0; i < 16; i++) {
// 将数据的最高位写入MOSI引脚
if (word & 0x8000) {
GpioDataRegs.GPBSET.bit.SPI_MOSI = 1;
} else {
GpioDataRegs.GPBCLEAR.bit.SPI_MOSI = 1;
}
asm(" RPT #20 ||NOP");
// 拉高时钟信号
GpioDataRegs.GPBSET.bit.SPI_CLK = 1;
asm(" RPT #80 ||NOP");
// 拉低时钟信号
GpioDataRegs.GPBCLEAR.bit.SPI_CLK = 1;
asm(" RPT #80 ||NOP");
// 将数据的最高位移出
word <<= 1;
}
}
Uint16 SPI_ReadWord(void) {
Uint16 i, word = 0;
// 拉低片选信号
GpioDataRegs.GPBCLEAR.bit.SPI_CS = 1;
asm(" RPT #10 ||NOP");
// 循环接收16位数据
for (i = 0; i < 16; i++) {
asm(" RPT #20 ||NOP");
// 拉高时钟信号
GpioDataRegs.GPBSET.bit.SPI_CLK = 1;
asm(" RPT #80 ||NOP");
// 读取MISO引脚的数据
word <<= 1;
word |= GpioDataRegs.GPBDAT.bit.SPI_MISO;
// 拉低时钟信号
GpioDataRegs.GPBCLEAR.bit.SPI_CLK = 1;
asm(" RPT #80 ||NOP");
}
// 拉高片选信号
GpioDataRegs.GPBSET.bit.SPI_CS = 1;
return word;
}
```
读函数需要按照SPI协议的规定,发送一个无效数据触发从设备的数据传输,因此在读函数中需要先发送一个无效数据来触发从设备的数据传输,具体实现可以参考上述代码。
阅读全文