根据SPI协议,写一字节数据到从机,为什么还要读出一字节的数据?示例程序如下:

根据SPI协议,写一字节数据到从机,为什么还要读出一字节的数据?示例程序如下:,第1张

SPI协议中接收和发送数据是一体的,数据传输的线路为一个循环链路(loop).如果主机发送数据给从机,则必须从从机读取数据(即从机也发送数据到主机).同理,如果主机读取从机发来的数据,也必须同时发送数据给从机.总之,同一个时钟周期内,读和写2个 *** 作都必须执行.

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

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存