使用一个STM32F103C8T6单片机,模拟一个SPI从机模式输出,求代码

使用一个STM32F103C8T6单片机,模拟一个SPI从机模式输出,求代码,第1张

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

}

SPI总线建议你使用STM32内置的SPI总线,网上有很多例程。如果你一定要模拟也是可以的。

IIC总线一直是STM32的诟病,用模拟总线更安全一些。

一般的IO口都可以配置成你说的四种模式的任意一种,而且编程过程中可以随时进行转换。

有些脚只能设置成输出或者输入,比如OSC32的IN,OUT做普通IO使用时就是如此。

这些在STM32的datasheet的引脚部分中都有详细说明。

IIC总线CLK要用推挽,数据总线在送出信号时设置成推挽,

输入如果没有上拉电阻时配置成上拉输入,有上拉则配置成浮空输入。

SPI总线的CLK,CS,MOSI脚设置成推挽,MISO脚配置成上拉输入。

可以。51试过以前使用12864液晶时使用单片机IO口模拟SPI总线,导致显示程序耗时多,频繁刷新屏幕有闪烁。STC新的单片机(比如STC12C5A60S2)自带有SPI总线接口,用SPI硬件驱动LCD无疑是一个很好的选择。做过LCD功能扩展的朋友们知道,LCD驱动程序的核心就是SPI通讯部分,我们只用改写这一部分程序就可以,其他程序不变。这里我参考了STC的数据手册和网友的一个程序,还有一个小问题就是丛机的片选端在STC的头文件中是P1.4,但给的演示程序中改为了P1.3,这点要注意。可以发现使用SPI总线驱动时执行效率很高,使用单片机口线最少,十分便于程序编写。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存