2个stm32怎么用spi通信

2个stm32怎么用spi通信,第1张

说几点注意的吧:

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 应用程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9365431.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存