使用BCM2835 Lib 控制Amiccom RF IC做Basic T/RX Link (此篇使用Raspberry Pi 4B 控制 A5133為例)
上篇介紹使用wiringPi製作SPI Driver控制A5133,參考:<使用WiringPi>
本篇換成使用BCM2835 Lib做T/RX Link
底下比較了WiringPi & BCM2835的差異性,可以看出BCM2835 執行 1 Byte的 all cs時間比WiringPi 還短很多,這有利後續需要做FIFO Ext時,可以有更快的SPI 速度
WiringPi SCS拉LOW後到真正第1 Bit SCK出現的時長~2.16us
BCM2835 SCS拉LOW後到真正第1 Bit SCK出現的時長~219.9ns,明顯縮短很多
Ubuntu安裝BCM2835 Lib
1.更新系统软件包列表:
sudo apt-get update
2.下载 BCM2835 库的最新版本:
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
3.解压缩下载的文件:
tar zxvf bcm2835-1.71.tar.gz
4.进入解压后的目录:
cd bcm2835-1.71
5.编译并安装库:
./configure make sudo make check sudo make install
Demo Code:<BCM2835_Raspberry Pi_ FIFO mode_0.5M_1M_2M_4Mbps_Colad9p_V0.7.zip>
大致架構與WiringPi的架構一樣,只有SPI 調用的Format不同而已,這裡可以理解成呼叫副含式的語法不同而已
BCM2835 SPI的設定如下:這邊需要注意BCM2835的SPI CLOCK是使用RPI的250Mhz去除頻的,這邊除以256,表示~1Mhz,
// 设置 SPI 位序为 MSB First bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // 设置 SPI 模式为 Mode 0 (CPOL = 0, CPHA = 0) bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // 设置 SPI 时钟分频器(时钟速度) bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_256); // 设置时钟为 1 MHz // 选择 SPI 通道的片选信号(CS0) bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // 设置片选信号的极性(低电平有效) bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);
這邊介紹BCM2835 SPI Write/Read函數,BCM2835與WiringPi都是使用數組的方式,一次將要傳輸的資料在一次的CS中傳送
MOSI單只寫1 Byte
bcm2835_spi_transfer(cmd);
ex:RF_StrobeCmd Function單獨只發一個byte的spi資料
void RF_StrobeCmd(uint8_t cmd) { bcm2835_spi_transfer(cmd); printf("Send CMD:0x%02X\n",cmd); }
連續MOSI Write 2Byte以上
bcm2835_spi_writenb((char*)data, 2); // 連續寫2Byte
ex:RF_WriteReg Function
1.先定義2Byte的數組
2. 分別填入資料,addr & dataByte
3.bcm2835_spi_writenb((char*)data, 2); // 連續寫2Byte
void RF_WriteReg(Uint8 addr, Uint8 dataByte) { uint8_t data[2]; data[0]=addr; data[1]=dataByte; printf("Sending data over SPI:Reg=0x%02X,Vaule=0x%02X,", data[0], data[1]); bcm2835_spi_writenb((char*)data, 2); // 連續寫2Byte printf("Send Finish\n"); }
全雙工,連續MOSI寫 MISO同步Read,適用於Read ID or ReadReg值使用
bcm2835_spi_transfern((char*)buffer, 9);
ex: RF_ReadID Function
先定義含Write 1 Byte buffer & Read 8 Byte,共9Byte的數組
定義buffer [0]為MOSI要Write的CMD
定義buffer[1]~[9] default 0x00
bcm2835_spi_transfern((char*)buffer, 9); // 连续写 1 字节,读 8 字节
void RF_ReadID(Uint8* ptr) { uint8_t buffer[9]; buffer[0]=(IDCODE_REG | 0x40); // 其余字节初始化为 0,用于接收数据 for (int i = 1; i < 9; i++) { buffer[i] = 0x00; } // 在同一个片选信号周期内发送 1 字节并接收 8 字节 bcm2835_spi_transfern((char*)buffer, 9); // 连续写 1 字节,读 8 字节 printf("Read ID Code="); for (int i=1; i<9; i++) { *ptr++ = buffer[i]; printf("0x%02X ", buffer[i]); } printf("\n"); }
其餘的A5133 RF_Init流程,寫data至FIFO Buffer ,TX CMD,Wait GIO2(WTR)go low都與上一篇wiringPi寫法一樣