对于SPI通信,上面的连线便是简单的一主一从连线图,对于简单的通信模式,例如我们要使用51单片机(使用I/O口模拟SPI通信)对一个外置的模块,例如ADC模块,当然ADC模块是SPI接口,那么一个简单的发送数据的函数如下:
adc_spi_send(unsigned char data){
ss = 0 ;//低电平表示选中AD,一般在程序开始直接拉低
for(i=0;i<8;i++){
sclk = 0;
if(data && 0x80)
mosi = 1;
else
mosi =0;
sclk = 1;
data <<= 1;
}
}
对于一般的MCU,AD模块都有数据建立时间和保持时间要求,所以对于一般使用MCU写SPI程序,都需要在sclk=0后,延时一段时间,具体看AD芯片时序,同样,在sclk=1之前也要延时一段时间。
当然了,这个在FPGA里边就不是问题了,那么为啥呢,请看下边:
reg[7:0] mosi,data;
reg[4:0] i;
always @(posedge sclk or negedge reset) begin
if(!reset | (i == 4'd8)) begin
sclk <= 1'b1;
mosi <= 1'b1;
i <= 1'b0;
end
else begin
if(data[i])
mosi <= 1'b1;
i <= i+1;
else
mosi <= 1'b0;
i <= i+1;
end
end
上面的FPGA程序(肯定有bug)直接表明在sclk上升沿的时候开始传数据,并且在可以事先对FPGA的clk分频,达到AD模块的要求,然后我们就不用担心那些延时多少,频率达到了,自然就不用延时了,很理想的实现了芯片手册上的时序,个人感觉FPGA在实现对这些通信方面实现的很完美。然后还有一点需要注意到是我们在主机上已经准备好数据了,那么从机什么时候去取这个数据(高或者低),可以想想,在芯片内部对于是SCLK的上升沿取数据还是下降沿取数据,应该可以设计出吧,没有固定的,哈哈,说一句没有的话,具体问题具体分析。