stm8 硬件spi 驱动 si4432 如果想看模拟的 我有另外一篇博文写有代码。
这个硬件驱动 si4432 我弄了几乎一天时间,我一边看波形一边分析数据,可是spi驱动一直没有成功。
第二天发现原来spi CPHA 相位应该选择 数据采样从第一采样边缘开始。 我之前不知道浪费了一天时间。心疼。
下面直接上代码:
MyType.h
#ifndef __MyType_H
#define __MyType_H
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
/* io configs */
#ifndef sbi
#define sbi(io,bit) ( io |= (1<<bit) )
//example:sbi(GPIOA->ODR,0);sbi(GPIOA->DDR,0);
#endif
#ifndef cbi
#define cbi(io,bit) ( io &= ~(1<<bit) )
//example:cbi(GPIOA->ODR,0);cbi(GPIOA->DDR,0);
#endif
#ifndef xor
#define xor(port, bit) (port) ^= (1 << (bit))
#endif
#ifndef gbi
#define gbi(pin ,bit) ( pin & (1<<bit) )
//example: gbi(GPIOA->IDR,0);
#endif
#endif
spi.c
#include "spi.h"
#include "ALL_Includes.h"
/*********************************************
函数功能:SPI初始化
输入参数:无
输出参数:无
备 注:无
*********************************************/
void SPI_Init(void)
{
SPI_IOConfig();
SPI->CR1 |= BIT(5)|BIT(3)|BIT(2); //主设备,高位先发,2分频 采集从第一时钟开始
SPI->CR2 |= BIT(1)|BIT(0);//nss软件管理
SPI->CR2 &=~(BIT(2)|BIT(7));//双线单向模式、全双工
SPI->CR1 |= BIT(6); //使能SPI BIT(6)
}
/*********************************************
函数功能:SPI IO初始化
输入参数:无
输出参数:无
备 注:无
*********************************************/
void SPI_IOConfig(void)
{
//设置SPI_SCK为输出
SPI_SCK_GPIO->DDR |= SPI_SCK ;//输出模式
SPI_SCK_GPIO->CR1 |= SPI_SCK ;//推挽输出
//设置PC6SPI_MOSI为输出
SPI_MOSI_GPIO->DDR |= SPI_MOSI;//输出模式
SPI_MOSI_GPIO->CR1 |= SPI_MOSI;//推挽输出
//设置SPI_CS为输出
SPI_CS_GPIO->DDR |= SPI_CS;//输出模式
SPI_CS_GPIO->CR1 |= SPI_CS;//推挽输出
//设置SPI_MISO为输入
SPI_MISO_GPIO->DDR &= ~SPI_MISO;//输入模式
SPI_MISO_GPIO->CR1 |= SPI_MISO;//上拉输入
}
/*********************************************
函数功能:SPI读写函数
输入参数:Data:需要写入的数据
输出参数:无
备 注:无
*********************************************/
u8 SPI_RW(u8 Data)
{
while(!(SPI->SR&0X02));//等待发送缓冲区为空
SPI->DR =Data;
while(!(SPI->SR&0X01));//等待接收缓冲区为非空
return (SPI->DR);
}