stm8 硬件SPI
2015-05-15 14:24
633 查看
第一步:stm8 SPI简介
在配置SPI相关寄存器时要注意时钟信号的相位和极性。
这次我们使用的是stm8驱动SO-8封装的DAC8830,使其输出一个方波。
DAC8830引脚说明和时序:
CS是片选信号,低电平有效。
SCLK在下降沿的时候启动传输,上升沿的时候传输完成。MSB在前,就是高位在前。
实际电路是按照DAC8830数据手册的典型应用电路做的。
只是输出部分没有加运放,VREF引脚没有连接。
再看stm8的SPI主模式:
第二步:SPI相关寄存器
设置时钟极性CPOL和相位CPHA仅需设置SPI_CR1的第0位和第1位。
第三步:具体实现
关于时钟和GPIO端口的配置请看《stm8 点亮第一个LED》
通过示波器测试出DAC8830的输出脚,波形如图:
至此stm8的硬件SPI介绍完毕,其他高级功能请查阅数据手册。
在配置SPI相关寄存器时要注意时钟信号的相位和极性。
这次我们使用的是stm8驱动SO-8封装的DAC8830,使其输出一个方波。
DAC8830引脚说明和时序:
CS是片选信号,低电平有效。
SCLK在下降沿的时候启动传输,上升沿的时候传输完成。MSB在前,就是高位在前。
实际电路是按照DAC8830数据手册的典型应用电路做的。
只是输出部分没有加运放,VREF引脚没有连接。
再看stm8的SPI主模式:
第二步:SPI相关寄存器
设置时钟极性CPOL和相位CPHA仅需设置SPI_CR1的第0位和第1位。
第三步:具体实现
void Spi_Init(void) { CLK_PCKENR1 |= 0x02; //打开SPI时钟 /*PC6、PC5设置为输出,最大10MHz*/ PC_DDR = 0x70; PC_CR1 = 0x70; PC_CR2 = 0x70; /*MSB、1MHz、主设备、CPOL空闲为低、CPHA第一个时钟开始*/ SPI_CR1 = 0x04; /*双线单向视距传输、CRC计算禁止、软件NSS、主模式*/ SPI_CR2 = 0x03; /*开启SPI*/ SPI_CR1|= 0x40; } /*DAC8830是TI的16位DA*/ void Spi_Send(u16 data) { PC_ODR_ODR4 = 0; //拉低片选 SPI_DR = (u8)(data>>8); //先发高八位 SPI_DR = (u8)data; //再发低八位 while(!(SPI_SR&0x02)); //等待发送区为空 PC_ODR_ODR4 = 1; //拉高片选 } int main( void ) { u16 i; System_Init(); //系统时钟初始化 Gpio_Init(); //PE5初始化 Spi_Init(); //Spi初始化 while (1) { Spi_Send(i); //输出阶梯波 delay_ms(50); i++; if(i==65535)i = 0; PE_ODR ^= 0x20; //PE5取反 } }
关于时钟和GPIO端口的配置请看《stm8 点亮第一个LED》
通过示波器测试出DAC8830的输出脚,波形如图:
至此stm8的硬件SPI介绍完毕,其他高级功能请查阅数据手册。
相关文章推荐
- 有关STC15W系列硬件SPI的配置问题
- ((硬件spi+dma)+模拟spi)驱动LCD5110
- ZSTACK HAL 硬件修改部分(端口,按键,串口SPI)
- STM32 3个硬件SPI的使用
- STM8S105K4使用硬件SPI来读取LSM9DS1
- AD7705在STM32F103RBT6上的移植[硬件SPI]
- STM8 SPI的学习
- 【嵌入式Linux+ARM】硬件相关基础知识(门电路_UART_I2C_SPI)
- 基于stm32f103zet6之硬件SPI的学习
- 关于STM8S使用硬件SPI收发问题
- linux enc28j60网卡驱动移植(硬件spi和模拟spi)
- 硬件GPIO,UART,I2C,SPI电路图
- linux enc28j60网卡驱动移植(硬件spi和模拟spi)
- stm8 io口 spi模拟,可用于RC522
- 从硬件层看SD/MMC(SPI模式)
- STM8的SPI
- STM8 SPI主机
- 【嵌入式Linux+ARM】硬件相关基础知识(门电路_UART_I2C_SPI)
- stm8 读取电表芯片 att7053 io口模拟 spi
- spi 协议硬件分析以及在linux上的实现分析