求两个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不用模拟,avr带这数烂个接口,直接用它提供的代码。手册上有。

void SPI_MasterInit(void)

{

/* 设置MOSI 和SCK 为输出,其薯李漏他为输入 */

DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)

/* 使能SPI 主机模式,设置时钟速率为fck/16 */

SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)

}

void SPI_MasterTransmit(char cData)

{

/* 启动数据传输 */

SPDR = cData

/* 等待传输结束 */

while(!(SPSR &(1<<SPIF)))

}

void SPI_SlaveInit(void)

{

/* 设置MISO 为输出,其他为输入 */

DDR_SPI = (1<<DD_MISO)

/* 使能 SPI */

SPCR = (1<<SPE)

}

char SPI_SlaveReceive(void)

{

/* 等待接收结束 */

while(!(SPSR &(1<<SPIF)))

/* 返回数据 */

return SPDR

}

void SPI_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE)

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_7

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL

GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_7)

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN

GPIO_SetBits(GPIOA,GPIO_Pin_6)

}

void SPI_ByteWr(unsigned char WrData) //spi 写

{

unsigned char i

GPIO_ResetBits(GPIOA,GPIO_Pin_4)

Delay(2)

GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5)

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

{

GPIO_ResetBits(GPIOA,GPIO_Pin_5)

Delay(2)

if((WrData&0x80) == 0x80)

GPIO_SetBits(GPIOA,GPIO_Pin_7)

else

GPIO_ResetBits(GPIOA,GPIO_Pin_7)

WrData <<= 1

GPIO_SetBits(GPIOA,GPIO_Pin_5)

Delay(2)

}

}

unsigned char SPI_ByteRd(void)//读取一个字节

{

unsigned char i

unsigned char RdData = 0

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

{

RdData <<= 1

GPIO_ResetBits(GPIOA,GPIO_Pin_5)

Delay(2)

if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))

RdData|=1

GPIO_SetBits(GPIOA,GPIO_Pin_5)

Delay(2)

}

return RdData

}


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

原文地址: https://outofmemory.cn/yw/12479136.html

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

发表评论

登录后才能评论

评论列表(0条)

保存