对于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的上升沿取数据还是下降沿取数据,应该可以设计出吧,没有固定的,哈哈,说一句没有的话,具体问题具体分析。