mbed SPI串行通讯主机应用 对于单片机来说,大多数时候它是当SPI主机使用,而当做SPI从机使用的一般是各种各样的传感器或执行器,xbed LPC1768上的at86rf231射频芯片采用的就是SPI通讯方式。SPI通讯主机应用的基本过程包括两步,首先是SPI的初始化,包括工作模式的确定,工作频率的确定等;然后再是SPI主机的收发,下面是一个读取xbed LPC1768附带射频芯片版本的示例代码: #define RF231_CSPIN P0_20 SPI RF231_spi(P0_18, P0_17, P0_15); DigitalOut RF231_cs(RF231_CSPIN); #define RG_PART_NUM (0x1c) #define RG_VERSION_NUM (0x1d) #define TRX_CMD_RADDR_MASK (0x3f) #define TRX_CMD_RR (1<<7) #define TRX_CMD_RW (1<<6|1<<5) Serial pc(USBTX,USBRX); void trx_reg_write(uint8_t addr, uint8_t val) { addr = TRX_CMD_RW | (TRX_CMD_RADDR_MASK & addr); RF231_cs = 0; RF231_spi.write(addr); RF231_spi.write(val); RF231_cs = 1; } uint8_t trx_reg_read(uint8_t addr) { uint8_t val; addr=TRX_CMD_RR | (TRX_CMD_RADDR_MASK & addr); RF231_cs = 0; RF231_spi.write(addr); val=RF231_spi.write(addr); RF231_cs=1; return (uint8_t)val; } int main() { RF231_cs = 1; RF231_spi.format(8, 0); RF231_spi.frequency(1000000); while (1) { pc.printf("RFIC part number and version number is:%d.%d \n",trx_reg_read(RG_PART_NUM),trx_reg_read(RG_VERSION_NUM)); wait(1); } }这里需要理解的就是SPI从机的寄存器地址的概念,其实大量的SPI通讯,尤其是和SPI外设之间的通讯其主要目的就是寄存器的读写,如上面例子的RG_PART_NUM和RG_VERSION_NUM就是保存射频芯片版本的寄存器地址, 在SPI读写时的如下操作: addr=TRX_CMD_RR | (TRX_CMD_RADDR_MASK & addr) 是根据AT86RF231的Datasheet编写的,其目的是为了区分是读寄存器还是写寄存器,以及限制各自可操作的寄存器地址范围,从上面的代码可以看出,对于一般的SPI通讯来说,读写是类似的,不管是读写,首先是拉低片选信号,然后发送需要操作的寄存器地址,最后再进行后续读写操作,如果是写,直接发送写入值即可,如果是读,可以再发送一次地址数据然后读取返回值。上面的代码中还给出了SPI写寄存器的函数,用户需要时可以操作。
|