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