找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1157|回复: 5
收起左侧

关于STM8单片机无法通过硬件SPI驱动oled的问题

[复制链接]
ID:888259 发表于 2022-1-8 22:13 | 显示全部楼层 |阅读模式

我这单片机代码有什么问题吗?

#include "iostm8s208mb.h"
#include "spi.h"


/*****************************
用IO口模拟SPI,选择OLED的模式
****************************/
/*
void SPI_WriteByte(unsigned char data,unsigned char cmd)
{
   unsigned char i=0;
    OLED_DC =cmd;//0命令,1数据
    OLED_CLK=0;
    for(i=0;i<8;i++)
    {
        OLED_CLK=0;
        if(data&0x80)OLED_MOSI=1; //从高位到低位
        else OLED_MOSI=0;
        OLED_CLK=1;
        data<<=1;
    }
    OLED_CLK=1;//上升沿读走一位数据
    OLED_DC=1;
}
*/


/*
通过硬件SPI通信
*/
void SPI_WriteByte(unsigned char data,unsigned char cmd)
{
  OLED_DC = cmd;
  while(!(SPI_SR&0x02));
  SPI_DR = data;
  //while(!(SPI_SR&0x01));
  OLED_DC = 1;
}

/****************************************************************/
//配置SPI引脚模式函数SPI_GPIO_Master_Init(),无形参,无返回值
/****************************************************************/
void SPI_GPIO_Master_Init(void)
{
  PC_DDR_DDR5=1;//配置PC5(SPI_SCK)端口为输出模式
  PC_CR1_C15=1;//配置PC5(SPI_SCK)端口为推挽输出模式
  PC_CR2_C25=1;//配置PC5(SPI_SCK)端口高速率输出
  PC_DDR_DDR6=1;//配置PC6(SPI_MOSI)端口为输出模式
  PC_CR1_C16=1;//配置PC6(SPI_MOSI)端口为推挽输出模式
  PC_CR2_C26=1;//配置PC6(SPI_MOSI)端口高速率输出
  PC_DDR_DDR7=0;//配置PC7(SPI_MISO)端口为输入模式
  PC_CR1_C17=1;//配置PC7(SPI_MISO)端口为弱上拉输入模式
  PC_CR2_C27=0;//禁止PC7(SPI_MISO)端口外部中断
  PE_DDR_DDR5=0;//配置PE5(SPI_NSS)端口为输入模式
  PE_CR1_C15=1;//配置PE5(SPI_NSS)端口为弱上拉输入模式
  PE_CR2_C25=0;//禁止PE5(SPI_NSS)端口外部中断
}


/****************************************************************/
//SPI模块配置函数SPI_CONFIG(),无形参,无返回值
/****************************************************************/
void SPI_CONFIG(void)
{
  SPI_CR1=0x1c;
  //**************************************************
  //展开SPI_CR1赋值二进制数值为:0000 0111
  //含义:LSBFIRST=0;先发送最高有效位
  //      SPE=0;禁止SPI设备
  //      BR[2:0]=000;波特率时钟配置为fmaster/2
  //      MSTR=1;配置为主设备
  //      CPOL=1;空闲状态时,SCK保持高电平
  //      CPHA=1;数据采样从第二个时钟边沿开始
  //*************************************************
  SPI_CR2=0x03;  
  //**************************************************
  //展开SPI_CR2赋值二进制数值为:0000 0000
  //含义:BDM=0;选择双线单向数据模式
  //      BDOE=0;输入使能(只接收模式)
  //      CRCEN=0;CRC计算禁止
  //      CRCNEXT=0;下一个发送的数据来自Tx缓冲区
  //      RXOnly=0;全双工(同时发送和接收)
  //      SSM=0;禁止软件从设备管理
  //      SSI=0;不能通过软件配置主从
  //*************************************************
  SPI_ICR=0x00;//禁止相关中断               
  SPI_CR1|=0x40;//位或 0x40 的目的在于单独将 SPE 位置“1”  
}

/*************************************************************************/
/*函数功能: 写命令                                                        */
/*************************************************************************/

void WriteCmd(unsigned char cmd)
{   
  SPI_WriteByte(cmd,OLED_CMD);
}

/*************************************************************************/
/*函数功能: 写数据                                                        */
/*************************************************************************/

void WriteData(unsigned char data)
{   
  SPI_WriteByte(data,OLED_DATA);
}                                                                                                                                                                                                                                                     
回复

使用道具 举报

ID:526543 发表于 2022-1-9 11:58 | 显示全部楼层
有案例代码吗  先跑案例代码吧
回复

使用道具 举报

ID:888259 发表于 2022-1-9 15:43 | 显示全部楼层
123456ZXC1 发表于 2022-1-9 11:58
有案例代码吗  先跑案例代码吧

是案例,没有用
回复

使用道具 举报

ID:739727 发表于 2022-1-9 16:06 | 显示全部楼层
选项字节配置了吗?

回复

使用道具 举报

ID:888259 发表于 2022-1-9 16:43 | 显示全部楼层
AAA_MCU 发表于 2022-1-9 16:06
选项字节配置了吗?

我用的IAR,选项字节配置了AFR7.Datasheet并没有写明是哪个选项字节开启硬件SPI的复用,很是离谱。我用的stm8208mb的单片机。
回复

使用道具 举报

ID:1001210 发表于 2022-1-11 10:10 | 显示全部楼层
用示波器看看波形对不对,保证数据写入正确
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表