这篇文章主要讲Arduino串行通信里的SPI通信。SPI(Serial Peripheral Interface,串行外设接口)高速通信接口一般用在于对于数据量要求比较大的设备或者场景里,例如SD卡,网络芯片,而Arduino支持SPI总线,从而可以和一些使用SPI总线的设备通信,一根SPI总线上可以连接多个SPI从设备。
初始化SPI通信,调用该函数后,SCK/MOSI/SS引脚将被设置为输出模式,且SCK/MOSI引脚拉低,SS引脚拉高。
关闭SPI总线通信
设置传输顺序。order:传输顺序,LSBFIRST,低位在前;MSBFIRST,高位在前
设置通信时钟,由主机产生,从机不用配置。divider:SPI通信的系统时钟分频得到,可选配置有SPI_CLOCK_DIV2、SPI_CLOCK_DIV4(默认配置)等,最大可达128分频
设置数据模式。mode:可配置的模式,可选项有SPI_MODE0、SPI_MODE1、SPI_MODE2、SPI_MODE3
传输1Byte的数据,SPI是全双工通信,所以发送1B的数据,也会接收到1B的数据。val:要发送的字节数据。
#include //引入SPI类库
const int PLL1 = 47; //定义SPI从设备的使能引脚
const int PLL2 = 48;
//因为篇幅原因,这里PLL寄存器的数据接收做了简化处理,两个从设备都只发送了一组数据,
//实际上这里需要发送多组寄存器数据才能使从设备工作,这也是根据不同的外部设备的规格定义去修改的。
//这里每组4个字节数据
unsigned char PLL1_Reg_buf0[4] = {0x00,0x30,0x1B,0x30};
unsigned char PLL2_Reg_buf0[4] = {0x00,0xBE,0x00,0x00};
void setup()
{
Serial.begin(9600);
pinMode(PLL1,OUTPUT);
pinMode(PLL2,OUTPUT); //管脚设置为输出模式
digitalWrite(PLL1,HIGH); //拉高SPI从设备引脚
digitalWrite(PLL2,HIGH);
delay(50);
SPI.setBitOrder(MSBFIRST); // 最高有效位
SPI.setDataMode(SPI_MODE0); // SCK上升沿输入,下降沿输出;SCK低电平空闲
SPI.begin(); // SCK MOSI SS设为输出模式,SCK MOSI拉低,SS拉高
set_frq();
delay(1000);
}
void loop()
{
}
void WriteToADF4350(unsigned char PLL,unsigned char count, unsigned char *buf)
{
if(PLL == 1) digitalWrite(PLL1,LOW); //拉低电平,选择对应SPI从设备
if(PLL == 2) digitalWrite(PLL2,LOW);
delay(50);
unsigned char ValueToWrite = 0;
unsigned char i = 0;
for(i=0;i<count;i++)
{
ValueToWrite = *(buf + i);
SPI.transfer(ValueToWrite); // 发送数据到SPI从设备
}
if(PLL == 1) digitalWrite(PLL1,HIGH); //拉高电平,释放对应SPI从设备
if(PLL == 2) digitalWrite(PLL2,HIGH);
delay(50);
}
void set_frq(void)
{
WriteToADF4350(1,4,PLL1_Reg_buf0);
delay(500);
WriteToADF4350(2,4,PLL2_Reg_buf0);
delay(500);
}