LPC1769上的SPI外设

时间:2016-04-19 12:28:45

标签: c spi lpc

我需要使用我的LPC1769将某些数据发送到带有SPI的FPGA。但是我不太明白我应该怎么做。我目前有这个代码,最终在hardfault处理程序中。我不允许使用CMSIS,因此我必须自己定义寄存器。

void sendData(uint8_t *buf, uint32_t Length) {
    uint32_t i;
    for (i = 0; i < Length; i++) {
        while (S0SPSR != (1 << 7)) {
            S0SPDR = *buf;
            gpio0WritePin(15, 1);
            gpio0WritePin(15, 0);
            buf++;
        }
    }
return;
}

和我的主要功能:

uint8_t TX[16];
int main(void) {
    SpiInit();
    TX[0] = 0x48;
    TX[1] = 0x65;
    TX[2] = 0x6c;
    TX[3] = 0x6c;
    TX[4] = 0x6f;
    while (1) {
        SPI_Begin();
        sendData((uint8_t*)TX, 5);
        SPI_End();
    }
 }

1 个答案:

答案 0 :(得分:1)

您绝对不希望像现代微控制器那样将数据丢包到SPI总线上。

如果由于某种原因您不允许使用CMSIS,我建议您查看how CMSIS does SPI communication。打开它(或者更好的是:打印出来),然后使用LPC176x/5x User Manual中的“第17章:LPC176x / 5x SPI”作为参考(第410-420页)。代码应该很容易理解。

简而言之,您需要:

  • 通过外设寄存器的电源控制启用SPI控制器,
  • 设置并启用此外设(外设时钟选择寄存器)的时钟,
  • 通过SPI控制寄存器配置与SPI(MOSI,MISO,CLK,CS),时钟极性等相关的I / O引脚,
  • 设置中断,这样您就不必在等待新数据进入时浪费时间绕状态寄存器循环,
  • 使用SPI数据寄存器一次读取和写入数据8位。

不要忘记使用中断,你的CPU周期最好用于处理数据(尤其是轮询状态寄存器,不幸的是非常常见错误)。