STM32CubeMx 软件模拟SPI四种模式
(1)SPI的概念SPI总线传输一共有种模式这种模式分别由时钟极性(CPOL)和时钟相位(CPHA)来定义。CPOL规定了SCK时钟信号空闲状态的电平CPHA规定了数据是在SCK时钟的上升沿还是下降沿被采样模式0CPOL0CPHA 0 SCK空闲为低电平数据在SCK的上升沿被采样模式1CPOL0CPHA 1 SCK空闲为低电平数据在SCK的下降沿被采样模式2CPOL1CPHA 0 SCK空闲为高电平数据在SCK的下降沿被采样模式3CPOL1CPHA 1 SCK空闲为高电平数据在SCK的上升沿被采样(2)延时函数的配置目前的话一般是推荐使用基本定时器去作为延时函数的计数从表格中我们了解到的是基本定时器分别是TIM6、TIM7分别是挂载在APB1上面的。下面的delay.h的内容#ifndef __BSP_DELAY_H #define __BSP_DELAY_H #include main.h #include tim.h void delay_us(uint16_t tim_us); void delay_ms(uint16_t tim_ms); void delay_s(uint16_t tim_s); #endif下面是delay.c的内容#include delay.h void delay_us(uint16_t tim_us) { __HAL_TIM_SET_COUNTER(htim6 , 0); while(__HAL_TIM_GetCounter(htim6) tim_us); } void delay_ms(uint16_t tim_ms) { for(int i 0 ; i 1000 ; i ) { __HAL_TIM_SET_COUNTER(htim6 , 0); while(__HAL_TIM_GetCounter(htim6) tim_ms); } } void delay_s(uint16_t tim_s) { for(int i 0 ; i 1000000 ; i ) { __HAL_TIM_SET_COUNTER(htim6 , 0); while(__HAL_TIM_GetCounter(htim6) tim_s); } }(3)软件模拟SPI的配置下面是SPI.h的内容#ifndef __SPI_H_ #define __SPI_H_ #include main.h #include SPI.h #include delay.h #define SPI_SCK_PIN GPIO_PIN_4 #define SPI_SCK_GPIO_PORT GPIOB #define SPI_MOSI_PIN GPIO_PIN_5 #define SPI_MOSI_GPIO_PORT GPIOB #define SPI_MISO_PIN GPIO_PIN_2 #define SPI_MISO_GPIO_PORT GPIOB #define SPI_NSS_PIN GPIO_PIN_3 #define SPI_NSS_GPIO_PORT GPIOB #define MOSI_H HAL_GPIO_WritePin(SPI_MOSI_GPIO_PORT, SPI_MOSI_PIN, GPIO_PIN_SET) #define MOSI_L HAL_GPIO_WritePin(SPI_MOSI_GPIO_PORT, SPI_MOSI_PIN, GPIO_PIN_RESET) #define SCK_H HAL_GPIO_WritePin(SPI_SCK_GPIO_PORT, SPI_SCK_PIN, GPIO_PIN_SET) #define SCK_L HAL_GPIO_WritePin(SPI_SCK_GPIO_PORT, SPI_SCK_PIN, GPIO_PIN_RESET) #define MISO HAL_GPIO_ReadPin(SPI_MISO_GPIO_PORT, SPI_MISO_PIN) #define NSS_H HAL_GPIO_WritePin(SPI_NSS_GPIO_PORT, SPI_NSS_PIN, GPIO_PIN_SET) #define NSS_L HAL_GPIO_WritePin(SPI_NSS_GPIO_PORT, SPI_NSS_PIN, GPIO_PIN_RESET) uint8_t SOFT_SPI_RW_MODE0(uint8_t write_dat); uint8_t SOFT_SPI_RW_MODE1(uint8_t byte); uint8_t SOFT_SPI_RW_MODE2(uint8_t byte); uint8_t SOFT_SPI_RW_MODE3(uint8_t write_dat); #endif下面是SPI.c的内容#include SPI.h /* CPOL 0, CPHA 0, MSB first */ uint8_t SOFT_SPI_RW_MODE0( uint8_t write_dat ) { uint8_t i, read_dat; for( i 0; i 8; i ) { if( write_dat 0x80 ) MOSI_H; else MOSI_L; write_dat 1; delay_us(1); SCK_H; read_dat 1; if( MISO ) read_dat; delay_us(1); SCK_L; __nop(); } return read_dat; } /* CPOL0,CPHA1, MSB first */ uint8_t SOFT_SPI_RW_MODE1(uint8_t byte) { uint8_t i,Temp0; for(i0;i8;i) { SCK_H; if(byte0x80) { MOSI_H; } else { MOSI_L; } byte 1; delay_us(1); SCK_L; Temp 1; if(MISO) Temp; delay_us(1); } return (Temp); } /* CPOL1,CPHA0, MSB first */ uint8_t SOFT_SPI_RW_MODE2(uint8_t byte) { uint8_t i,Temp0; for(i0;i8;i) { if(byte0x80) { MOSI_H; } else { MOSI_L; } byte 1; delay_us(1); SCK_L; Temp 1; if(MISO) Temp; delay_us(1); SCK_H; } return (Temp); } /* CPOL 1, CPHA 1, MSB first */ uint8_t SOFT_SPI_RW_MODE3( uint8_t write_dat ) { uint8_t i, read_dat; for( i 0; i 8; i ) { SCK_L; if( write_dat 0x80 ) MOSI_H; else MOSI_L; write_dat 1; delay_us(1); SCK_H; read_dat 1; if( MISO ) read_dat; delay_us(1); __nop(); } return read_dat; }(4)四种模式逻辑分析仪测试参考软件模拟SPI接口程序代码4种模式_模拟spi程序-CSDN博客HAL库TIM定时器精准延时_stm32cubemx如何配置延时函数-CSDN博客
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2450549.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!