求两个51单片机模拟SPI通信程序,主机和从机的程序!!

求两个51单片机模拟SPI通信程序,主机和从机的程序!!,第1张

1.定义三个gpio: p0-sclk, p1-sdi, p2-sdo;p0用于模拟spi的clock,p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接悉轮单片机B的p0,A的p1接B的p2,A的p2接B的p12.发送程序:clock拉低,sdo输出0或1(数据),延时一定时间,clock拉高,延时一定时间,薯陆禅这样A就发送一位数据到B,循环8次就发送一个字节数据3.接收程序:检测clock状态,如果为低,就读取sdi,直到clock拉高,结束该次输入,重复8次,读取数尘一个字节注意:1。clock空闲状态为高,发送数据就拉低;2.还需要加入起始停止同步协议,可根据需要进行完善

注意 spi_delay根据你从设备的速度,你可以从5开始慢慢减小,直到为0.

/*******************************************************************************

名称:void SPI1_Init()

功能:模拟SPI时序的端口初始化工作

参数:无

时间:2011.1.11

版本:1.0

注意:无

*******************************************************************************/

void SPI1_Init()

{

SPI1_Port|=((1<<SPI1_CS)|(1<<SPI1_MISO)|(1<<SPI1_MOSI)|(1<<SPI1_CLK))

SPI1_DDR|=(((1<枯梁<SPI1_CS)|(1<<SPI1_MOSI)|(1<<SPI1_CLK))&(~(1<<SPI1_MISO)))

SPI1_CS_H

SPI1_CLK_L

spi_delay=5

}

/*******************************************************************************

名称:SPI1_Send(unsigned char data)

功能:发送SPI数据

参数:unsigned char data

时间:2011.1.11

版本:1.0

注意:无

*******************************************************************************/

void SPI1_Send(unsigned char data)

{

unsigned char i

SPI1_CS_L //拉低片选信号

SPI1_CLK_L//时钟空闲时为低电平

SPI1_MOSI_L

_delay_us(spi_delay)

for(i=0i<8i++)

{

if(data&(0x80>>i))//高位在前,低位在前改为(0x01<<i)

SPI1_MOSI_H

else

SPI1_MOSI_L

_delay_us(spi_delay)

SPI1_CLK_H//在上升沿更新数据

_delay_us(spi_delay)

SPI1_CLK_L

}

_delay_us(spi_delay)

SPI1_CS_H //拉高片选,完成一次数据传输

}

/*******************************************************************************

名称:unsigned char SPI1_Get()

功掘让能:接收SPI数据

参数:返回data

时间:2011.1.11

版本:1.0

注意:无

*******************************************************************************/

unsigned char SPI1_Get()

{

unsigned char i

unsigned char data=0x00

SPI1_CS_L //拉低片选信号

SPI1_CLK_L//时钟空闲时为低电平

SPI1_MOSI_L

_delay_us(spi_delay)

for(i=0i<8i++)

{

if(SPI1_GetMISO)

data|=(0x80>>i)

_delay_us(spi_delay)

SPI1_CLK_H//在上判败局升沿更新数据

_delay_us(spi_delay)

SPI1_CLK_L

}

_delay_us(spi_delay)

SPI1_CS_H //拉高片选,完成一次数据传输

return data

}

有没有写皮族进去,读回来就知道歼旁了。另外你的读函数中if(SPI_DI==1) dat|=0x01else dat&=0x01这一段,置一对了燃改弊,但是清零错了,应该是dat&=0xfe


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

原文地址: http://outofmemory.cn/yw/12529328.html

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

发表评论

登录后才能评论

评论列表(0条)

保存