使用BCM2835 Lib 控制Amiccom RF IC做Basic T/RX Link (此篇使用Raspberry Pi 4B 控制 A5133為例)

SamYang2024-10-16Linux24
  • 上篇介紹使用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

image.png

BCM2835  SCS拉LOW後到真正第1 Bit SCK出現的時長~219.9ns,明顯縮短很多

image.png

  • 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

  1. 先定義含Write 1 Byte buffer & Read 8 Byte,共9Byte的數組

  2. 定義buffer [0]為MOSI要Write的CMD

  3. 定義buffer[1]~[9] default 0x00

  4. 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寫法一樣



发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。