
说几点注意的吧:
1、一个设置为主机模式,一个设置为丛机模式
2、将mosi、miso、nss、clk对应的连接起来就是了
3、波特率设置一样
4、配置spi,下面以配置SPI1主机模式为例如:
SPI_InitStructureSPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线双向全双工
SPI_InitStructureSPI_DataSize = SPI_DataSize_8b;//8位数据
SPI_InitStructureSPI_CPOL = SPI_CPOL_High;//空闲时钟为高电平
SPI_InitStructureSPI_CPHA = SPI_CPHA_2Edge;//第2个时钟边沿读写数据
SPI_InitStructureSPI_NSS = SPI_NSS_Soft;//软件控制使能脚
SPI_SSOutputCmd(SPI1,ENABLE);
SPI_InitStructureSPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//SPI时钟频率
SPI_InitStructureSPI_FirstBit = SPI_FirstBit_MSB;//高位在前
SPI_InitStructureSPI_CRCPolynomial = 7;//CRC校验
SPI_InitStructureSPI_Mode = SPI_Mode_Master;//SPI1主机模式
SPI_Init(SPI1,&SPI_InitStructure);
飞思卡尔S12系列的单片机基本上都有SPI接口,而且一般可以切换复用的,比如XS128就可以用PS4-7或者PM口进行通信,2个单片机进行SPI通信的时候,普通模式下需要4个线,即:SS,CLK,MISO,MOSI,接线的时候记得设置主从关系,然后的交叉MOSI和MISO即可。
对应关系:
SS----SS
CLK---CLK
MISO---MOSI
MOSI---MISO
你所指的spidevc是SPI的用户模式设备接口的驱动,可以通过应用程序去 *** 作/dev/spidev达到与硬件设备的SPI通信,对于 *** 作SPI NOR FLASH,更多是注册为MTD设备,详细可参考drivers/mtd/device/m25p80c,里面已经有相关实现。
但无论如何,前提是你的内核里已经有SPI控制器的驱动,否则如何通信呢。代码一般在drivers/spi/里。
那是应该是给spi设备驱动范本吧,可以籍此写自己的spi设备驱动,没有设备节点就自己创建个嘛。或者在驱动中添加创建设备节点的函数。
对于C8051F330而言,你需要设置好SPI的时序,极性以及空闲时的状态,一般在送完一个字节后,要等待spi中断后,在能进行第二次送数据
我截取部分程序给你看看
void SPI_INT(void) //SPI初始化
{
SPI0CFG=0x40;
SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三线主方式
SPI0CKR=0x0f; //SPI 时钟频率设置为100kHz 0x63
IE &= 0xbf; //关闭SPI中断
}
void pio_int(void) // 端口配置
{
XBR0=0x06;
XBR1=0x40;
P0MDIN=0xff; //禁止模拟输入,0为模拟,1为数字
P0MDOUT=0x0d; //0为开漏,1为推挽(ff)
P0SKIP=0x08;
P1MDIN=0xff;
P1MDOUT=0xff; //低四位用于138
P1SKIP=0x00;
P0=0xff;
P1=0xff;
}
//
SPI0DAT = sm[i];
while(!SPIF);
SPIF=0;
//这部分就是SPI的传输指令,送一个字节后,等待中断,然后清中断
标志,然后再送
//按照你想要的东西,就可以写成
for(i=0;i<12;i++)
{
SPI0DAT = sm[i];
while(!SPIF);
SPIF=0;
CLK = 1;//这个就定义成你595的所存输出
CLK = 0;
delay(1);//像你送一个595显示的话,还要延时一下
//如有更多的,就送多次再延时
}
//
我空间有个点阵驱动的程序,你可以去看看
用的就是你的这个单片机
日志名字
QQ空间247519442
C8051F330 1616点阵(SPI 、SMBus、I2C)PCF8563
//你的程序我看得有点晕,我这有个SPI的程序,你看一下吧
//同步
module spi(iSignRst_n,iSysClk,iSDI,oSDO,iSCK,iCS,oLED);
input iSignRst_n,iSysClk,iSDI,iSCK,iCS;
output reg oSDO;
output reg [7:0] oLED;
reg [7:0] rIData;
reg [7:0] rOData;
reg rReg0Sck,rReg1Sck;
reg rReg0Cs, rReg1Cs;
reg rReg0Sdi,rReg1Sdi;
reg [3:0] rCntShift;
wire wUpSck,wDownSck;
//wire wUpCs,wDownCs;
wire wHighCs,wLowCs;
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
{rReg0Sck,rReg1Sck} <= 2'd0;
else
{rReg0Sck,rReg1Sck} <= {rReg1Sck,iSCK};
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
{rReg0Cs, rReg1Cs} <= 2'd3;
else
{rReg0Cs, rReg1Cs} <= {rReg1Cs,iCS};
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
{rReg0Sdi,rReg1Sdi} <= 2'd0;
else
{rReg0Sdi,rReg1Sdi} <= {rReg1Sdi,iSDI};
assign wUpSck = (~rReg0Sck) && rReg1Sck;
assign wDownSck = rReg0Sck && (~rReg1Sck);
//assign wUpCs = (~rReg0Cs) && rReg1Cs;
//assign wDownCs = rReg0Cs && (~rReg1Sck);
assign wHighCs = rReg0Cs && rReg1Cs ;
assign wLowCs = (~rReg0Cs) && (~rReg1Cs);
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
rCntShift <= 4'd0;
else
if(wHighCs)
rCntShift <= 4'd0;
else
if(wUpSck)begin
if(rCntShift>=4'd15)
rCntShift <= 4'd15;
else
rCntShift <= rCntShift + 1'b1;
end
//else
// rCntShift <= rCntShift;
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
rIData <= 8'd0;
else
if(wLowCs && wDownSck)
rIData <= {rIData[6:0],rReg0Sdi };
else
rIData <= rIData;
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
oLED <= 8'd0;
else
if((rCntShift==4'd8)&&wUpSck)
oLED <= rIData;
else
oLED <= oLED;
//你的oDATA不知道是怎么得出来的,我就重复上一个idata了
always @(posedge iSysClk or negedge iSignRst_n)
if(~iSignRst_n)
{oSDO,rOData} <= 9'd0;
else
if(wHighCs)
{oSDO,rOData} <= {1'b0,oLED};
else
if(wUpSck)
{oSDO,rOData} <= {rOData,1'b0};
//else
// {oSDO,rOData} <= {oSDO,rOData};
endmodule
//异步
module spi(iSignRst_n,iSysClk,iSDI,oSDO,iSCK,iCS,oLED);
input iSignRst_n,iSysClk,iSDI,iSCK,iCS;
output wire oSDO;
output reg [7:0] oLED;
reg [7:0] rIData;
reg [7:0] rOData;
reg [3:0] rCntShift;
always @(negedge iSCK or posedge iCS)
if(iCS)
rIData <= 8'd0;
else
rIData <= {rIData[6:0],iSDI};
always @(posedge iSCK or posedge iCS)
if(iCS)
rCntShift <= 4'd0;
else
if(rCntShift>=4'd15)
rCntShift <= 4'd15;
else
rCntShift <= rCntShift + 1'b1;
always @(posedge iSCK or negedge iSignRst_n)
if(~iSignRst_n)
oLED <= 8'd0;
else
if(rCntShift==4'd8)
oLED <= rIData;
else
oLED <= oLED;
always @(posedge iSCK or posedge iCS)
if(iCS)
rOData <= 8'd0;
else
if(rCntShift==4'd0)
rOData <= oLED;
else
rOData <= {rOData[6:0],1'b0};
assign oSDO = rOData[7];
endmodule
以上就是关于2个stm32怎么用spi通信全部的内容,包括:2个stm32怎么用spi通信、飞思卡尔两个单片机如何进行SPI通信、linux spi 应用程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)