stm32学习笔记--SPI通信以及OLED屏幕显示

 

 

 

 

SPI中沿变化,导致寄存器与数据线的数据进行交互;iic中高电平时寄存器与数据线进行交互

/*********************************iBoxV300*********************************                                      
 
	                         \\\|///
                       \\  - -  //
                        (  @ @  )
+---------------------oOOo-(_)-oOOo-------------------------+
|                                                           |
|                             Oooo                          |
+-----------------------oooO--(   )-------------------------+
                       (   )   ) /
                        \ (   (_/
                         \_)           
***************************************************************************/
#include "spi_driver.h"
#include "uart1_driver.h"

/**********************************************************
**************************引脚定义*************************

**SPI_CLK:			PC4
**SPI_MOSI:			PC5
***********************************************************/

/*********************************************************
					变量定义
*********************************************************/



/******************************************************
**函数功能:SPI初始化
*******************************************************/
void SPI_InitConfig(void)
{
#if 0
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);  
	

	SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; 
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;	 			
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	 	
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		 	
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;		
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		  
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  			
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI1, &SPI_InitStructure);

	// Enable SPI1  
	SPI_Cmd(SPI1, ENABLE);
#endif
	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOC, &GPIO_InitStructure);  
	
}




#if 0
void SPI_WriterByte(u8 dat)
{
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

	// 通过 SPI2发送一字节数据 
	SPI_I2S_SendData(SPI1, dat);	
}
#endif

#if 1
#define OLED_SCLK_Clr()		GPIO_ResetBits(GPIOC, GPIO_Pin_4)
#define OLED_SCLK_Set()		GPIO_SetBits(GPIOC, GPIO_Pin_4)

#define OLED_SDIN_Clr()		GPIO_ResetBits(GPIOC, GPIO_Pin_5)	
#define OLED_SDIN_Set()		GPIO_SetBits(GPIOC, GPIO_Pin_5)


void SPI_WriterByte(u8 dat)
{	
	u8 i;			  

	for(i=0;i<8;i++)
	{			  
		OLED_SCLK_Clr();     //时钟设置为低电平,为了产生上升沿,在这个上升沿产生之前准备数据
		if(dat&0x80)        //判断最高位
		{
			OLED_SDIN_Set();  //MOSI准备高电平
		}
		else
		OLED_SDIN_Clr();  //MOSI准备低电平
		OLED_SCLK_Set();      ////时钟设置为高电平,产生上升沿,让OLED读取数据
		dat<<=1;              //左移
	}
}
#endif

#if 0
//假设PC1---SCK
 //     PC2---MOSI
 //     PC3---MISO 
//      PC4---CS
#define OLED_SCK_Clr()		GPIO_ResetBits(GPIOC, GPIO_Pin_1)
#define OLED_SCK_Set()		GPIO_SetBits(GPIOC, GPIO_Pin_1)
#define  MOSI_SET_1()         GPIO_SetBits(GPIOC, GPIO_Pin_2)
#define  MOSI_SET_0()         GPIO_ResetBits(GPIOC, GPIO_Pin_2)
#define  MISO_READ()          GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)
#define  CS()                 GPIO_ResetBits(GPIOC, GPIO_Pin_4)

//10
unsigned char spi_send_byte(unsigned char data)
{
	int i;
	int temp = 0;
	
	OLED_SCK_Set();
	
	for(i= 0; i < 8; i++)
	{
		OLED_SCK_Clr();
		
		if(MISO_READ() == 1)
			temp | = 0x01;
		else
			temp |= 0x00;
		temp = temp << 1;
		
		if(data & 0x80)
			MOSI_SET_1();
		else
			MOSI_SET_0();
		
		OLED_SCK_Set();	
		data = data << 1;
	}
}


//11
unsigned char spi_send_byte(unsigned char data)
{
	int i;
	int temp = 0;

	OLED_SCK_Set
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值