刚入门的小白,关于SPI接口在使用时碰到了问题,求大佬指点,多谢!:)
在做一个STM32的小车STM32F103R6T6,其中用到了0.96寸的OLED屏和一个RGB_LED灯。
OLED屏使用了SPI通信,相应引脚和接口的对应关系为:CS--PC6; DC--PC7; RES--PC8; D1--PC9; D0--PC10。
OLED模块的接口定义为:D0,在 SPI和 IIC通信中为时钟管脚 ;D1,在 SPI和 IIC通信中为数据管脚; RES ,用来复位(低电平复位);DC ,数据和命令控制管脚。
RGB_LED引脚为 PA6和 PA7,用0/1控制颜色。
使用的是HAL库和CUBEMX。小车要一边显示测距的实时信息,一边闪烁LED。
在用STMCUBEMX配置时,SPI显示PA6/PA7/PB3引脚被其他占用,无法使用SPI。 所以OLED的D0和D1脚是必须接在芯片的SPI口上吗?普通IO口可以进行SPI通信吗?
离线
STM32F103R6T6 应该还有别的几组 SPI 吧?
没,芯片手册里说只有一个SPI
离线
OLED用普通IO口模拟SPI驱动也是没问题的,网上IO口模拟SPI的代码很多的
离线
用软件来模拟spi,类似模拟iic那样,应该是可以的
离线
void LCD_SPI_gpio_config(void)
{
gpio_mode_set(LCD_DOUT_PART, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, LCD_DOUT_PIN);
gpio_mode_set(LCD_SDA_PART, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_SDA_PIN);
gpio_output_options_set(LCD_SDA_PART, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, LCD_SDA_PIN);
gpio_bit_set(LCD_SDA_PART, LCD_SDA_PIN);
gpio_mode_set(LCD_SCL_PART, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LCD_SCL_PIN);
gpio_output_options_set(LCD_SCL_PART, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, LCD_SCL_PIN);
gpio_bit_set(LCD_SCL_PART, LCD_SCL_PIN);
}
void SPI_WriteByte(uint8_t Byte)
{
uint8_t i=0;
for(i=0;i<8;i++)
{
if(Byte&0x80)
{
SPI_MOSI_SET;
}
else
{
SPI_MOSI_CLR;
}
SPI_SCLK_CLR;
SPI_SCLK_CLR;
SPI_SCLK_CLR;
SPI_SCLK_SET;
Byte<<=1;
}
}
uint8_t SPI_ReadByte(void)
{
uint8_t value=0,i=0,byte=0xFF;
for(i=0;i<8;i++)
{
value<<=1;
if(byte&0x80)
{
SPI_MOSI_SET;
}
else
{
SPI_MOSI_CLR;
}
byte<<=1;
SPI_SCLK_CLR;
LCD_delay_us(100);
if(SPI_MISO_READ)
{
value += 1;
}
SPI_SCLK_SET;
LCD_delay_us(100);
}
return value;
}
网上一搜一大把
离线