parent
19096cc93e
commit
7eeae6e673
@ -0,0 +1,136 @@ |
|||||||
|
#include "FreeRTOS.h" |
||||||
|
#include "task.h" |
||||||
|
#include "main.h" |
||||||
|
#include "cmsis_os.h" |
||||||
|
#include "tim.h" |
||||||
|
|
||||||
|
extern void delay_us(uint16_t nus); |
||||||
|
|
||||||
|
// HAL_RCC_GetSysClockFreq(void)
|
||||||
|
|
||||||
|
typedef enum{ |
||||||
|
DELAY_DEFAULT, |
||||||
|
DELAY_SYSTICK, |
||||||
|
DELAY_SYSTICK_COMPLEX, |
||||||
|
DELAY_TIMER,
|
||||||
|
|
||||||
|
}DELAY_US_TypeDef; |
||||||
|
// SystemCoreClock
|
||||||
|
|
||||||
|
TIM_HandleTypeDef *Delay_TIM_hanle = NULL; |
||||||
|
|
||||||
|
#define DELAY_US_TYPE DELAY_DEFAULT |
||||||
|
|
||||||
|
|
||||||
|
void delay_us(uint16_t nus) |
||||||
|
{
|
||||||
|
#if DELAY_US_TYPE == DELAY_DEFAULT |
||||||
|
uint32_t cnt = nus * (SystemCoreClock/8000000); |
||||||
|
while(cnt--); |
||||||
|
#endif |
||||||
|
|
||||||
|
#if DELAY_US_TYPE == DELAY_TIMER |
||||||
|
|
||||||
|
__HAL_TIM_SET_COUNTER(&htim10, 0); // set the counter value a 0
|
||||||
|
__HAL_TIM_ENABLE(&htim10); // start the counter
|
||||||
|
// wait for the counter to reach the us input in the parameter
|
||||||
|
while (__HAL_TIM_GET_COUNTER(&htim10) < nus); |
||||||
|
__HAL_TIM_DISABLE(&htim10); // stop the counter
|
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
#if DELAY_US_TYPE == DELAY_SYSTICK |
||||||
|
SysTick->LOAD = (nus * (SystemCoreClock/8000000))-1;
|
||||||
|
SysTick->VAL = 0; |
||||||
|
SysTick->CTRL = 0; |
||||||
|
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; |
||||||
|
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); |
||||||
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
#if DELAY_US_TYPE == DELAY_SYSTICK_COMPLEX |
||||||
|
|
||||||
|
// 暂停系统,实现微秒延时
|
||||||
|
// 保存sysTick的状态
|
||||||
|
uint32_t val_temp=SysTick->VAL; |
||||||
|
uint32_t load_temp=SysTick->LOAD; |
||||||
|
uint16_t ctrl_temp=SysTick->CTRL; |
||||||
|
|
||||||
|
/*SysTick状态重新设置,用于延时(系统暂停)*/ |
||||||
|
// SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数
|
||||||
|
SysTick->LOAD = (nus * HAL_RCC_GetSysClockFreq()/1000000) - 1; // 设置定时器重装值,168MHz 8分频后21HMz,即一微秒记21个数
|
||||||
|
SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值
|
||||||
|
SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器
|
||||||
|
while (!(SysTick->CTRL & 0x00010000));// 等待计数到0
|
||||||
|
|
||||||
|
/*延时结束后恢复之前的状态,系统继续运行*/ |
||||||
|
SysTick->LOAD = load_temp; |
||||||
|
SysTick->VAL = val_temp; |
||||||
|
SysTick->CTRL = ctrl_temp; |
||||||
|
//SysTick->CTRL = 0x00000000; // 关闭定时器
|
||||||
|
#endif |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// #if DELAY_US_TYPE == DELAY_TIMER
|
||||||
|
// void delay_us(uint16_t nus)
|
||||||
|
// {
|
||||||
|
// __HAL_TIM_SET_COUNTER(&htim10, 0); // set the counter value a 0
|
||||||
|
// __HAL_TIM_ENABLE(&htim10); // start the counter
|
||||||
|
// // wait for the counter to reach the us input in the parameter
|
||||||
|
// while (__HAL_TIM_GET_COUNTER(&htim10) < nus);
|
||||||
|
// __HAL_TIM_DISABLE(&htim10); // stop the counter
|
||||||
|
// }
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #if DELAY_US_TYPE == DELAY_SYSTICK_COMPLEX
|
||||||
|
// void delay_us(uint16_t nus)
|
||||||
|
// {
|
||||||
|
// // // 暂停系统,实现微秒延时
|
||||||
|
// // // 保存sysTick的状态
|
||||||
|
// // uint32_t val_temp=SysTick->VAL;
|
||||||
|
// // uint32_t load_temp=SysTick->LOAD;
|
||||||
|
// // uint16_t ctrl_temp=SysTick->CTRL;
|
||||||
|
|
||||||
|
// // /*SysTick状态重新设置,用于延时(系统暂停)*/
|
||||||
|
// // SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数
|
||||||
|
// // SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值
|
||||||
|
// // SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器
|
||||||
|
// // while (!(SysTick->CTRL & 0x00010000));// 等待计数到0
|
||||||
|
|
||||||
|
// // /*延时结束后恢复之前的状态,系统继续运行*/
|
||||||
|
// // SysTick->LOAD = load_temp;
|
||||||
|
// // SysTick->VAL = val_temp;
|
||||||
|
// // SysTick->CTRL = ctrl_temp;
|
||||||
|
// // //SysTick->CTRL = 0x00000000; // 关闭定时器
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #if DELAY_US_TYPE == DELAY_TIMER
|
||||||
|
// void delay_us(uint16_t nus)
|
||||||
|
// {
|
||||||
|
// // // 暂停系统,实现微秒延时
|
||||||
|
// // // 保存sysTick的状态
|
||||||
|
// // uint32_t val_temp=SysTick->VAL;
|
||||||
|
// // uint32_t load_temp=SysTick->LOAD;
|
||||||
|
// // uint16_t ctrl_temp=SysTick->CTRL;
|
||||||
|
|
||||||
|
// // /*SysTick状态重新设置,用于延时(系统暂停)*/
|
||||||
|
// // SysTick->LOAD = 9 * us; // 设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数
|
||||||
|
// // SysTick->VAL = 0x00; // 清空当前计数值,清空后会自动装入重载值
|
||||||
|
// // SysTick->CTRL = 0x00000001; // 位2设置为0,8分频,启动定时器
|
||||||
|
// // while (!(SysTick->CTRL & 0x00010000));// 等待计数到0
|
||||||
|
|
||||||
|
// // /*延时结束后恢复之前的状态,系统继续运行*/
|
||||||
|
// // SysTick->LOAD = load_temp;
|
||||||
|
// // SysTick->VAL = val_temp;
|
||||||
|
// // SysTick->CTRL = ctrl_temp;
|
||||||
|
// // //SysTick->CTRL = 0x00000000; // 关闭定时器
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// #endif
|
@ -0,0 +1,176 @@ |
|||||||
|
|
||||||
|
#include "main.h" |
||||||
|
#include "cmsis_os.h" |
||||||
|
#include "usart.h" |
||||||
|
#include "tim.h" |
||||||
|
#include "bsp_uart.h" |
||||||
|
#include "bsp_i2c.h" |
||||||
|
|
||||||
|
#include "elog.h" |
||||||
|
|
||||||
|
#include "base.h" |
||||||
|
|
||||||
|
// #include "PH.h"
|
||||||
|
// #include "temperature.h"
|
||||||
|
|
||||||
|
#if 1 |
||||||
|
|
||||||
|
// #define huart3_helper ph_uart_helper
|
||||||
|
#define huart3_helper temp_uart_helper |
||||||
|
#define hi2c1_helper ads1115_i2c_helper |
||||||
|
|
||||||
|
extern osSemaphoreId_t elog_dma_lockHandle; |
||||||
|
|
||||||
|
|
||||||
|
void USART1_IRQHandler(void) |
||||||
|
{ |
||||||
|
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != RESET) |
||||||
|
{ |
||||||
|
osSemaphoreRelease(elog_dma_lockHandle); |
||||||
|
huart1.gState = HAL_UART_STATE_READY; |
||||||
|
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); |
||||||
|
} |
||||||
|
HAL_UART_IRQHandler(&huart1); |
||||||
|
} |
||||||
|
|
||||||
|
void USART3_IRQHandler(void) |
||||||
|
{ |
||||||
|
|
||||||
|
if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) != RESET) |
||||||
|
{ |
||||||
|
log_i(" usart 3 it tc ... "); |
||||||
|
huart3.gState = HAL_UART_STATE_READY; |
||||||
|
// max3160_485_receive_mode();
|
||||||
|
// TODO 回调函数,带obj
|
||||||
|
UART_HELPER_Trans_TxCplt_Callback( huart3_helper ); |
||||||
|
|
||||||
|
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC); |
||||||
|
} |
||||||
|
|
||||||
|
// if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)
|
||||||
|
// {
|
||||||
|
// log_i( " usart3 it rxne....");
|
||||||
|
// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (__HAL_UART_GET_FLAG( &huart3, UART_FLAG_IDLE ) != RESET){ |
||||||
|
log_i(" usart 3 it idle ... "); |
||||||
|
uint16_t count = __HAL_DMA_GET_COUNTER( huart3.hdmarx ); |
||||||
|
// // 判断是否有数据 count 为剩余未接收的字节数
|
||||||
|
if (huart3_helper->rcv_size != count)
|
||||||
|
{ |
||||||
|
UART_HELPER_RCV_IDLE_Callback( huart3_helper , (huart3_helper->rcv_size-count)); |
||||||
|
} |
||||||
|
__HAL_UART_CLEAR_IDLEFLAG( &huart3 ); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
HAL_UART_IRQHandler(&huart3); |
||||||
|
} |
||||||
|
|
||||||
|
void USART6_IRQHandler(void) |
||||||
|
{ |
||||||
|
if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_TC) != RESET) |
||||||
|
{ |
||||||
|
huart6.gState = HAL_UART_STATE_READY; |
||||||
|
|
||||||
|
log_i(" usart 6 it ... "); |
||||||
|
__HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_TC); |
||||||
|
} |
||||||
|
if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_RXNE) != RESET) |
||||||
|
{ |
||||||
|
log_i( " huart6 it...."); |
||||||
|
__HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_TC); |
||||||
|
} |
||||||
|
HAL_UART_IRQHandler(&huart6); |
||||||
|
} |
||||||
|
|
||||||
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
||||||
|
{ |
||||||
|
|
||||||
|
if (huart->Instance == huart3.Instance) |
||||||
|
{ |
||||||
|
log_i("....huart3 rx callback.... " ); |
||||||
|
UART_HELPER_RCV_Cplt_Callback( huart3_helper ); |
||||||
|
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_RXNE); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||||
|
// {
|
||||||
|
|
||||||
|
// if (huart->Instance == huart3.Instance)
|
||||||
|
// {
|
||||||
|
// /* 拷贝数据 到菜单 */
|
||||||
|
// log_i("huart3 idle -> ****** HAL_UARTEx_RxEventCallback ");
|
||||||
|
// __HAL_UART_CLEAR_IDLEFLAG(&huart3);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
||||||
|
// {
|
||||||
|
// // if (huart->Instance == huart3.Instance)
|
||||||
|
// // {
|
||||||
|
// // // max3160_485_receive_mode();
|
||||||
|
// // // huart3.gState = HAL_UART_STATE_READY;
|
||||||
|
// // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
|
||||||
|
// // }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
/******************************* I2C CallBack *********************************/ |
||||||
|
void I2C1_EV_IRQHandler(void) |
||||||
|
{ |
||||||
|
HAL_I2C_EV_IRQHandler(&hi2c1); |
||||||
|
} |
||||||
|
void I2C1_ER_IRQHandler(void) |
||||||
|
{ |
||||||
|
HAL_I2C_ER_IRQHandler(&hi2c1); |
||||||
|
} |
||||||
|
|
||||||
|
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) |
||||||
|
{ |
||||||
|
log_i( " HAL_I2C_Mem TxCpltCallback ------------------- "); |
||||||
|
if (hi2c == &hi2c1) |
||||||
|
{ |
||||||
|
log_i( " HAL_I2C_Mem TxCpltCallback --- hi2c1 ---------------- "); |
||||||
|
I2C_HELPER_Trans_TxCplt_Callback(hi2c1_helper); |
||||||
|
} |
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) |
||||||
|
{ |
||||||
|
log_i( " HAL_I2C_Mem RxCpltCallback ------------------- "); |
||||||
|
{ |
||||||
|
log_i( " HAL_I2C_Mem RxCpltCallback --- hi2c1 ---------------- "); |
||||||
|
I2C_HELPER_Trans_TxCplt_Callback(hi2c1_helper); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) |
||||||
|
{ |
||||||
|
log_i( " i2c master send cplt ------------------- "); |
||||||
|
} |
||||||
|
|
||||||
|
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) |
||||||
|
{ |
||||||
|
log_i( " i2c master rx cplt ------------------- "); |
||||||
|
} |
||||||
|
|
||||||
|
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) |
||||||
|
{ |
||||||
|
log_i( " HAL_I2C_ErrorCallback ------------------- "); |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
void TIM1_UP_TIM10_IRQHandler(void) |
||||||
|
{ |
||||||
|
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */ |
||||||
|
|
||||||
|
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */ |
||||||
|
HAL_TIM_IRQHandler(&htim10); |
||||||
|
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */ |
||||||
|
|
||||||
|
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */ |
||||||
|
} |
@ -1,142 +1,126 @@ |
|||||||
#ifndef __BSP_I2C_SOFT_H |
#ifndef __BSP_I2C_SOFT_H |
||||||
#define __BSP_I2C_SOFT_H |
#define __BSP_I2C_SOFT_H |
||||||
|
#include "stm32f4xx_hal.h" |
||||||
|
|
||||||
#include "main.h" |
#include "main.h" |
||||||
#include "stm32f4xx.h" |
// #include "sys.h"
|
||||||
|
|
||||||
|
// #define SCL_GPIO_PORT GPIOB
|
||||||
|
// #define SCL_PIN GPIO_PIN_6
|
||||||
|
// #define SDA_GPIO_PORT GPIOB
|
||||||
|
// #define SDA_PIN GPIO_PIN_7
|
||||||
|
|
||||||
|
|
||||||
// //使用IIC1 PB6 -> SCL, PB7 -> SDA
|
typedef enum { |
||||||
|
IIC_OK = 0x00, //IIC工作正常
|
||||||
|
IIC_WAIT_ACK_ERR = 0x01, //slave设备返回ACK错误
|
||||||
|
IIC_WRITE_ERR = 0x02, //向slave设备写入错误
|
||||||
|
IIC_READ_ERR = 0x04 //从slave设备读取错误
|
||||||
|
} IIC_STATUS; |
||||||
|
|
||||||
#define SCL_PORT GPIOB |
typedef struct |
||||||
#define SCL_PIN GPIO_PIN_6 |
{ |
||||||
#define SDA_PORT GPIOB |
GPIO_TypeDef *scl_port; //定义IIC时钟使用的端口
|
||||||
#define SDA_PIN GPIO_PIN_7 |
uint16_t scl_pin; //定义IIC时钟使用的PIN脚
|
||||||
|
GPIO_TypeDef *sda_port; //定义IIC数据使用的端口
|
||||||
|
uint16_t sda_pin; //定义IIC数据使用的PIN脚
|
||||||
|
uint8_t sda_pin_num; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
||||||
|
uint8_t addr; //器件地址
|
||||||
|
uint32_t delaytick; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
||||||
|
}IIC_SOFT_TypeDef; |
||||||
|
|
||||||
// #define SDA_IN() { SDA_PORT->MODER &= ~(3 << 1 * 2); SDA_PORT->MODER = (0 << 1 * 2); } //PC1 1*2,
|
//IO方向设置
|
||||||
// #define SDA_OUT() { SDA_PORT->MODER &= ~(3 << 1 * 2); SDA_PORT->MODER = (1 << 1 * 2); }
|
#define SDA_IN() {SDA_GPIO_PORT->MODER&=~(3<<(7*2));SDA_GPIO_PORT->MODER|=0<<7*2;} //PB7输入模式
|
||||||
|
#define SDA_OUT() {SDA_GPIO_PORT->MODER&=~(3<<(7*2));SDA_GPIO_PORT->MODER|=1<<7*2;} //PB7输出模式
|
||||||
|
|
||||||
#define SDA_IN() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 0<<7*2;} //PB7输入模式
|
|
||||||
#define SDA_OUT() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 1<<7*2;} //PB7输出模式
|
|
||||||
|
|
||||||
|
#define GPIO_WRITE_PIN(PORT,PIN,VALUE) HAL_GPIO_WritePin(PORT,PIN,(VALUE)?GPIO_PIN_SET:GPIO_PIN_RESET) |
||||||
|
#define GPIO_READ_PIN(PORT,PIN) HAL_GPIO_ReadPin(PORT,PIN) |
||||||
|
|
||||||
//IO操作函数
|
|
||||||
#define i2c_scl_low() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_RESET) |
|
||||||
#define i2c_scl_high() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET) |
|
||||||
|
|
||||||
#define i2c_sda_low() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_RESET) |
//IIC所有操作函数
|
||||||
#define i2c_sda_high() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET) |
// void IIC_Init( ); //初始化IIC的IO口
|
||||||
|
|
||||||
#define i2c_read_sda() HAL_GPIO_ReadPin( SDA_PORT, SDA_PIN ) |
void IIC_Init(const IIC_SOFT_TypeDef *pSoftIIC); //初始化IIC的IO口
|
||||||
|
|
||||||
extern uint32_t delay1us; |
int IIC_READ_SDA_Pin(const IIC_SOFT_TypeDef *pSoftIIC); |
||||||
|
int IIC_SDA_Mode_In(const IIC_SOFT_TypeDef *pSoftIIC); |
||||||
|
int IIC_SDA_Mode_Out(const IIC_SOFT_TypeDef *pSoftIIC); |
||||||
|
|
||||||
void delay_1us(uint32_t delay_1us); |
void IIC_Start(const IIC_SOFT_TypeDef *pSoftIIC); //发送IIC开始信号
|
||||||
|
void IIC_Stop(const IIC_SOFT_TypeDef *pSoftIIC); //发送IIC停止信号
|
||||||
|
void IIC_Send_Byte(const IIC_SOFT_TypeDef *pSoftIIC,uint8_t txd); //IIC发送一个字节
|
||||||
|
// uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
|
||||||
|
uint8_t IIC_Read_Byte( const IIC_SOFT_TypeDef *pSoftIIC);//IIC读取一个字节
|
||||||
|
uint8_t IIC_Wait_Ack(const IIC_SOFT_TypeDef *pSoftIIC); //IIC等待ACK信号
|
||||||
|
void IIC_Ack(const IIC_SOFT_TypeDef *pSoftIIC); //IIC发送ACK信号
|
||||||
|
void IIC_NAck(const IIC_SOFT_TypeDef *pSoftIIC); //IIC不发送ACK信号
|
||||||
|
|
||||||
void analog_i2c_delay(void); |
|
||||||
|
|
||||||
void bsp_analog_i2c_init(void); |
uint8_t IIC_Read_Test(const IIC_SOFT_TypeDef *pSoftIIC, uint8_t reg_addr, uint8_t *buf, uint8_t len); |
||||||
|
uint8_t IIC_Write_Test(const IIC_SOFT_TypeDef *pSoftIIC , uint8_t reg_addr, uint8_t *buf, uint8_t len); |
||||||
|
|
||||||
void bsp_analog_i2c_start(void); |
|
||||||
|
|
||||||
void bsp_analog_i2c_stop(void); |
#endif |
||||||
|
|
||||||
uint8_t bsp_analog_i2c_wait_ack(void); |
|
||||||
|
|
||||||
void bsp_analog_i2c_ack(void); |
/*
|
||||||
|
时序 |
||||||
|
// * @brief: I2C 开始,SCL为高电平的时候SDA产生一个下降沿信号
|
||||||
|
|
||||||
void bsp_analog_i2c_nack(void); |
// _____
|
||||||
|
// *SDA \_____________
|
||||||
|
// * __________
|
||||||
|
// *SCL \________
|
||||||
|
//
|
||||||
|
|
||||||
void bsp_analog_i2c_send_byte(uint8_t data); |
|
||||||
|
|
||||||
uint8_t bsp_analog_i2c_read_byte(void); |
// * @brief: I2C 停止,SCL为高电平的时候SDA产生一个上升沿信号
|
||||||
|
// _______
|
||||||
|
// *SDA __________/
|
||||||
|
// * ____________
|
||||||
|
// *SCL _____/
|
||||||
|
|
||||||
|
|
||||||
|
// * @brief: I2C 响应
|
||||||
|
// ____
|
||||||
|
// *SCL ______/ \______
|
||||||
|
// * ____ _____
|
||||||
|
// *SDA \_______/
|
||||||
|
//
|
||||||
|
|
||||||
|
// * @brief: I2C 不响应
|
||||||
|
|
||||||
|
// ____
|
||||||
|
// *SCL ______/ \______
|
||||||
|
// * __________________
|
||||||
|
// *SDA
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
// //使用IICX PB6 -> SCL, PB7 -> SDA
|
HAL_I2C_MspDeInit( &hi2c1 ); |
||||||
|
uint8_t readout[256] = {0}; |
||||||
|
uint8_t writein[1] = {0xFB}; |
||||||
|
|
||||||
// #define SCL_PORT GPIOB
|
// IIC_Init( );
|
||||||
// #define SCL_PIN GPIO_PIN_6
|
|
||||||
// #define SDA_PORT GPIOB
|
|
||||||
// #define SDA_PIN GPIO_PIN_7
|
|
||||||
|
|
||||||
//IO方向设置
|
// IIC_Write_Test( 0xA0, 0, writein, 1 );
|
||||||
// #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} //PB7输入模式
|
// HAL_Delay( 200 );
|
||||||
// #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} //PB7输出模式
|
|
||||||
|
|
||||||
// #define SDA_IN() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 0<<7*2;} //PB7输入模式
|
|
||||||
// #define SDA_OUT() {GPIOB->MODER &= ~(3<<(7*2)); GPIOB->MODER |= 1<<7*2;} //PB7输出模式
|
|
||||||
|
|
||||||
// //IO操作
|
|
||||||
// #define IIC_SCL PBout(6) //SCL
|
|
||||||
// #define IIC_SDA PBout(7) //SDA
|
|
||||||
// #define READ_SDA PBin(7) //输入SDA
|
|
||||||
|
|
||||||
// //IIC所有操作函数
|
|
||||||
// void IIC_Init(void); //初始化IIC的IO口
|
|
||||||
// void IIC_Start(void); //发送IIC开始信号
|
|
||||||
// void IIC_Stop(void); //发送IIC停止信号
|
|
||||||
// void IIC_Send_Byte(uint8_t txd); //IIC发送一个字节
|
|
||||||
// uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
|
|
||||||
// uint8_t IIC_Wait_Ack(void); //IIC等待ACK信号
|
|
||||||
// void IIC_Ack(void); //IIC发送ACK信号
|
|
||||||
// void IIC_NAck(void); //IIC不发送ACK信号
|
|
||||||
|
|
||||||
// void IIC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
|
// IIC_Read_Test( 0xA0, 0, readout, 1 );
|
||||||
// uint8_t IIC_Read_One_Byte(uint8_t daddr,uint8_t addr);
|
|
||||||
|
|
||||||
/*
|
// log_i("iic test %02X .... ", *readout);
|
||||||
//在AT24CXX指定地址读出一个数据
|
|
||||||
//ReadAddr:开始读数的地址
|
|
||||||
//返回值 :读到的数据
|
|
||||||
u8 AT24CXX_ReadOneByte(u16 ReadAddr) |
|
||||||
{
|
|
||||||
u8 temp=0;
|
|
||||||
IIC_Start();
|
|
||||||
if(EE_TYPE>AT24C16) |
|
||||||
{ |
|
||||||
IIC_Send_Byte(0XA0); //发送写命令
|
|
||||||
IIC_Wait_Ack(); |
|
||||||
IIC_Send_Byte(ReadAddr>>8);//发送高地址
|
|
||||||
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
IIC_Send_Byte(ReadAddr%256); //发送低地址
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
IIC_Start();
|
|
||||||
IIC_Send_Byte(0XA1); //进入接收模式
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
temp=IIC_Read_Byte(0);
|
|
||||||
IIC_Stop();//产生一个停止条件
|
|
||||||
return temp; |
|
||||||
} |
|
||||||
//在AT24CXX指定地址写入一个数据
|
|
||||||
//WriteAddr :写入数据的目的地址
|
|
||||||
//DataToWrite:要写入的数据
|
|
||||||
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) |
|
||||||
{
|
|
||||||
IIC_Start();
|
|
||||||
if(EE_TYPE>AT24C16) |
|
||||||
{ |
|
||||||
IIC_Send_Byte(0XA0); //发送写命令
|
|
||||||
IIC_Wait_Ack(); |
|
||||||
IIC_Send_Byte(WriteAddr>>8);//发送高地址
|
|
||||||
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
IIC_Send_Byte(WriteAddr%256); //发送低地址
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
IIC_Send_Byte(DataToWrite); //发送字节
|
|
||||||
IIC_Wait_Ack();
|
|
||||||
IIC_Stop();//产生一个停止条件
|
|
||||||
delay_ms(10);
|
|
||||||
} |
|
||||||
*/ |
|
||||||
|
|
||||||
|
IIC_SOFT_TypeDef sIIC = { |
||||||
|
GPIOB, GPIO_PIN_6, GPIOB, GPIO_PIN_7, |
||||||
|
7,0xA0,1, |
||||||
|
}; |
||||||
|
IIC_Init( &sIIC ); |
||||||
|
|
||||||
|
IIC_Write_Test( &sIIC,0xA0, 0, writein, 1 ); |
||||||
|
HAL_Delay( 200 ); |
||||||
|
|
||||||
|
IIC_Read_Test(&sIIC, 0xA0, 0, readout, 1 ); |
||||||
|
|
||||||
#endif |
log_i("iic test %02X .... ", *readout); |
||||||
|
|
||||||
|
*/ |
@ -0,0 +1,115 @@ |
|||||||
|
#ifndef __BSP_SPI_SOFT_H |
||||||
|
#define __BSP_SPI_SOFT_H |
||||||
|
#include "stm32f4xx_hal.h" |
||||||
|
#include "main.h" |
||||||
|
// #include "sys.h"
|
||||||
|
|
||||||
|
// #define SCL_GPIO_PORT GPIOB
|
||||||
|
// #define SCL_PIN GPIO_PIN_6
|
||||||
|
// #define SDA_GPIO_PORT GPIOB
|
||||||
|
// #define SDA_PIN GPIO_PIN_7
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
SPI_OK = 0x00, //IIC工作正常
|
||||||
|
SPI_WAIT_ACK_ERR = 0x01, //slave设备返回ACK错误
|
||||||
|
SPI_WRITE_ERR = 0x02, //向slave设备写入错误
|
||||||
|
SPI_READ_ERR = 0x04 //从slave设备读取错误
|
||||||
|
} SPI_STATUS; |
||||||
|
|
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
GPIO_TypeDef *sclk_port;
|
||||||
|
uint16_t sclk_pin;
|
||||||
|
GPIO_TypeDef *mosi_port;
|
||||||
|
uint16_t mosi_pin;
|
||||||
|
GPIO_TypeDef *miso_port;
|
||||||
|
uint16_t miso_pin;
|
||||||
|
GPIO_TypeDef *cs_port;
|
||||||
|
uint16_t cs_pin;
|
||||||
|
uint8_t sda_pin_num; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
||||||
|
uint8_t addr; //器件地址
|
||||||
|
uint32_t delaytick; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
|
||||||
|
}SPI_SOFT_TypeDef; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define CS_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET) |
||||||
|
#define CS_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET) |
||||||
|
#define SCLK_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET) |
||||||
|
#define SCLK_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET) |
||||||
|
#define SDI_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET) |
||||||
|
#define SDI_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET) |
||||||
|
#define SDO_R HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) |
||||||
|
|
||||||
|
#define SUCCESS 0 |
||||||
|
#define FAILURE 1 |
||||||
|
|
||||||
|
void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI);
|
||||||
|
uint8_t WriteReg(uint32_t d); |
||||||
|
uint8_t ReadReg(uint32_t d);
|
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
时序 |
||||||
|
// * @brief: I2C 开始,SCL为高电平的时候SDA产生一个下降沿信号
|
||||||
|
|
||||||
|
// _____
|
||||||
|
// *SDA \_____________
|
||||||
|
// * __________
|
||||||
|
// *SCL \________
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
// * @brief: I2C 停止,SCL为高电平的时候SDA产生一个上升沿信号
|
||||||
|
// _______
|
||||||
|
// *SDA __________/
|
||||||
|
// * ____________
|
||||||
|
// *SCL _____/
|
||||||
|
|
||||||
|
|
||||||
|
// * @brief: I2C 响应
|
||||||
|
// ____
|
||||||
|
// *SCL ______/ \______
|
||||||
|
// * ____ _____
|
||||||
|
// *SDA \_______/
|
||||||
|
//
|
||||||
|
|
||||||
|
// * @brief: I2C 不响应
|
||||||
|
|
||||||
|
// ____
|
||||||
|
// *SCL ______/ \______
|
||||||
|
// * __________________
|
||||||
|
// *SDA
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
HAL_I2C_MspDeInit( &hi2c1 ); |
||||||
|
uint8_t readout[256] = {0}; |
||||||
|
uint8_t writein[1] = {0xFB}; |
||||||
|
|
||||||
|
// SPI_Init( );
|
||||||
|
|
||||||
|
// SPI_Write_Test( 0xA0, 0, writein, 1 );
|
||||||
|
// HAL_Delay( 200 );
|
||||||
|
|
||||||
|
// SPI_Read_Test( 0xA0, 0, readout, 1 );
|
||||||
|
|
||||||
|
// log_i("iic test %02X .... ", *readout);
|
||||||
|
|
||||||
|
SPI_SOFT_TypeDef sIIC = { |
||||||
|
GPIOB, GPIO_PIN_6, GPIOB, GPIO_PIN_7, |
||||||
|
7,0xA0,1, |
||||||
|
}; |
||||||
|
SPI_Init( &sIIC ); |
||||||
|
|
||||||
|
SPI_Write_Test( &sIIC,0xA0, 0, writein, 1 ); |
||||||
|
HAL_Delay( 200 ); |
||||||
|
|
||||||
|
SPI_Read_Test(&sIIC, 0xA0, 0, readout, 1 ); |
||||||
|
|
||||||
|
log_i("iic test %02X .... ", *readout); |
||||||
|
|
||||||
|
*/ |
@ -1,583 +1,218 @@ |
|||||||
#include "bsp_i2c_soft.h" |
#include "bsp_i2c_soft.h" |
||||||
|
#include "elog.h" |
||||||
|
// #include "delay.h"
|
||||||
|
|
||||||
|
void IIC_Init(const IIC_SOFT_TypeDef *pSoftIIC ) |
||||||
|
{ |
||||||
|
GPIO_InitTypeDef GPIO_Initure; |
||||||
|
|
||||||
uint32_t delay1us; |
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
|
||||||
|
|
||||||
/**
|
//PB6 SCL PB7初始化设置
|
||||||
* @brief: 1us延时 |
GPIO_Initure.Pin = pSoftIIC->scl_pin ; |
||||||
* @param {uint32_t} delay_1us |
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
|
||||||
* @return {*} |
GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
|
||||||
*/ |
GPIO_Initure.Speed = GPIO_SPEED_FAST; // 快速
|
||||||
// void delay_1us(uint32_t delay_1us)
|
HAL_GPIO_Init( pSoftIIC->scl_port, &GPIO_Initure ); |
||||||
// {
|
|
||||||
// HAL_TIM_Base_Start_IT( &htim3 );
|
|
||||||
// delay1us = delay_1us;
|
|
||||||
// while (delay1us);
|
|
||||||
// HAL_TIM_Base_Stop_IT( &htim3 );
|
|
||||||
// }
|
|
||||||
|
|
||||||
void delay_1us(uint32_t delay_1us) |
// SDA PB7 初始化设置
|
||||||
{ |
GPIO_Initure.Pin = pSoftIIC->sda_pin; |
||||||
uint16_t cnt = 0; |
HAL_GPIO_Init( pSoftIIC->sda_port, &GPIO_Initure );
|
||||||
|
|
||||||
while(delay_1us--) |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1); |
||||||
{ |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);
|
||||||
for(cnt=168/5; cnt>0; cnt--); // TODO 168
|
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
// static void delay_us(uint32_t u_sec)
|
|
||||||
// {
|
int IIC_READ_SDA_Pin(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
// uint16_t cnt = 0;
|
|
||||||
|
|
||||||
// while(u_sec--)
|
|
||||||
// {
|
|
||||||
// for(cnt=168/5; cnt>0; cnt--);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief: IIC延时时间 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void analog_i2c_delay(void) |
|
||||||
{ |
{ |
||||||
delay_1us(2); |
return HAL_GPIO_ReadPin(pSoftIIC->sda_port,pSoftIIC->sda_pin); |
||||||
} |
} |
||||||
|
|
||||||
/**
|
int IIC_SDA_Mode_In(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
* @brief: 软件模拟I2C初始化 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void bsp_analog_i2c_init(void) |
|
||||||
{ |
{ |
||||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; |
// 取针脚号 pin6 的值为 2^6
|
||||||
|
// GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
|
||||||
__HAL_RCC_GPIOD_CLK_ENABLE(); |
pSoftIIC->sda_port->MODER&=~(3<<(pSoftIIC->sda_pin_num*2)); |
||||||
__HAL_RCC_GPIOC_CLK_ENABLE(); |
pSoftIIC->sda_port->MODER|=0<<pSoftIIC->sda_pin_num*2; |
||||||
|
|
||||||
/*Configure GPIO pins : PD6 SCL */ |
|
||||||
GPIO_InitStruct.Pin = SCL_PIN; |
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|
||||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; |
|
||||||
HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct); |
|
||||||
|
|
||||||
/*Configure GPIO pins : PC1 SDA */ |
|
||||||
GPIO_InitStruct.Pin = SDA_PIN; |
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
|
||||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; |
|
||||||
HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct); |
|
||||||
|
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
} |
} |
||||||
|
int IIC_SDA_Mode_Out(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
/**
|
|
||||||
* @brief: I2C 开始,SCL为高电平的时候SDA产生一个下降沿信号 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void bsp_analog_i2c_start(void) |
|
||||||
{ |
{ |
||||||
/* _____
|
// GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
|
||||||
*SDA \_____________ |
pSoftIIC->sda_port->MODER&=~(3<<(pSoftIIC->sda_pin_num*2)); |
||||||
* __________ |
pSoftIIC->sda_port->MODER|=1<<pSoftIIC->sda_pin_num*2; |
||||||
*SCL \________ |
|
||||||
*/ |
|
||||||
i2c_sda_high(); |
|
||||||
i2c_scl_high(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_sda_low(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_scl_low(); |
|
||||||
analog_i2c_delay(); |
|
||||||
} |
} |
||||||
|
//产生IIC起始信号
|
||||||
/**
|
void IIC_Start(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
* @brief: I2C 停止,SCL为高电平的时候SDA产生一个上升沿信号 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void bsp_analog_i2c_stop(void) |
|
||||||
{ |
{ |
||||||
/* _______
|
// SDA_OUT();//sda线输出
|
||||||
*SDA __________/ |
IIC_SDA_Mode_Out( pSoftIIC); //sda线输出
|
||||||
* ____________ |
|
||||||
*SCL _____/ |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
|
||||||
*/ |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); |
||||||
i2c_sda_low(); |
delay_us(4); |
||||||
i2c_scl_high(); |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 0); //START:when CLK is high,DATA change form high to low
|
||||||
analog_i2c_delay(); |
delay_us(4); |
||||||
i2c_sda_high(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0);//钳住I2C总线,准备发送或接收数据
|
||||||
analog_i2c_delay(); |
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
//产生IIC停止信号
|
||||||
* @brief: I2C 等待响应 |
void IIC_Stop(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
uint8_t bsp_analog_i2c_wait_ack(void) |
|
||||||
{ |
{ |
||||||
uint32_t timeout = 0; |
// SDA_OUT();//sda线输出
|
||||||
|
IIC_SDA_Mode_Out( pSoftIIC); //sda线输出
|
||||||
i2c_sda_high(); |
|
||||||
SDA_IN(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0); |
||||||
analog_i2c_delay(); |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 0);//STOP:when CLK is high DATA change form low to high
|
||||||
i2c_scl_high(); |
delay_us(4); |
||||||
analog_i2c_delay(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);
|
||||||
while(i2c_read_sda()) |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);//发送I2C总线结束信号
|
||||||
|
delay_us(4);
|
||||||
|
} |
||||||
|
//等待应答信号到来
|
||||||
|
//返回值:1,接收应答失败
|
||||||
|
// 0,接收应答成功
|
||||||
|
uint8_t IIC_Wait_Ack(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
|
{ |
||||||
|
uint8_t ucErrTime=0; |
||||||
|
// SDA_IN(); //SDA设置为输入
|
||||||
|
IIC_SDA_Mode_In( pSoftIIC); //SDA设置为输入
|
||||||
|
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);delay_us(1);
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);delay_us(1);
|
||||||
|
while(IIC_READ_SDA_Pin(pSoftIIC)) |
||||||
|
// while( READ_SDA() )
|
||||||
{ |
{ |
||||||
timeout++; |
ucErrTime++; |
||||||
if(timeout > 2000) |
if(ucErrTime>250) |
||||||
{ |
{ |
||||||
|
IIC_Stop(pSoftIIC); |
||||||
return 1; |
return 1; |
||||||
} |
} |
||||||
} |
} |
||||||
i2c_scl_low(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0);//时钟输出0
|
||||||
analog_i2c_delay(); |
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
//产生ACK应答
|
||||||
/**
|
void IIC_Ack(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
* @brief: I2C 响应 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void bsp_analog_i2c_ack(void) |
|
||||||
{ |
{ |
||||||
/* ____
|
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0); |
||||||
*SCL ______/ \______ |
|
||||||
* ____ _____ |
|
||||||
*SDA \_______/ |
|
||||||
*/ |
|
||||||
i2c_sda_low(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_scl_high(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_scl_low(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_sda_high(); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
// SDA_OUT();//sda线输出
|
||||||
* @brief: I2C 不响应 |
IIC_SDA_Mode_Out( pSoftIIC); //sda线输出
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
void bsp_analog_i2c_nack(void) |
|
||||||
{ |
|
||||||
/* ____
|
|
||||||
*SCL ______/ \______ |
|
||||||
* __________________ |
|
||||||
*SDA |
|
||||||
*/ |
|
||||||
i2c_sda_high(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_scl_high(); |
|
||||||
analog_i2c_delay(); |
|
||||||
i2c_scl_low(); |
|
||||||
analog_i2c_delay(); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 0); |
||||||
* @brief: I2C 发送一个字节数据 |
delay_us(2); |
||||||
* @param {uint8_t} data |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); |
||||||
* @return {*} |
delay_us(2); |
||||||
*/ |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0); |
||||||
void bsp_analog_i2c_send_byte(uint8_t data) |
} |
||||||
|
//不产生ACK应答
|
||||||
|
void IIC_NAck(const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
{ |
{ |
||||||
uint8_t i; |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0); |
||||||
|
|
||||||
SDA_OUT(); |
// SDA_OUT();//sda线输出
|
||||||
for(i = 0; i < 8; i++) |
IIC_SDA_Mode_Out( pSoftIIC); //sda线输出
|
||||||
{ |
|
||||||
if(data & 0x80) |
|
||||||
{ |
|
||||||
i2c_sda_high(); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
i2c_sda_low(); |
|
||||||
} |
|
||||||
|
|
||||||
analog_i2c_delay(); |
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1); |
||||||
i2c_scl_high(); |
delay_us(2); |
||||||
analog_i2c_delay(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); |
||||||
i2c_scl_low(); |
delay_us(2); |
||||||
if(i == 7) |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0); |
||||||
{ |
}
|
||||||
i2c_sda_high(); |
//IIC发送一个字节
|
||||||
} |
//返回从机有无应答
|
||||||
data <<= 1; |
//1,有应答
|
||||||
analog_i2c_delay(); |
//0,无应答
|
||||||
|
void IIC_Send_Byte(const IIC_SOFT_TypeDef *pSoftIIC,uint8_t txd) |
||||||
|
{
|
||||||
|
uint8_t t;
|
||||||
|
// SDA_OUT();//sda线输出
|
||||||
|
IIC_SDA_Mode_Out( pSoftIIC); //sda线输出
|
||||||
|
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0);//拉低时钟开始数据传输
|
||||||
|
for(t=0;t<8;t++) |
||||||
|
{
|
||||||
|
// IIC_SDA=(txd&0x80)>>7;
|
||||||
|
// IIC_SDA( (txd&0x80)>>7);
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, (txd&0x80)>>7 ); |
||||||
|
txd<<=1;
|
||||||
|
delay_us(2); //对TEA5767这三个延时都是必须的
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); |
||||||
|
delay_us(2);
|
||||||
|
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0);
|
||||||
|
delay_us(2); |
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
uint8_t IIC_Read_Byte( const IIC_SOFT_TypeDef *pSoftIIC) |
||||||
* @brief: I2C 读一个字节数据 |
|
||||||
* @return {*} |
|
||||||
*/ |
|
||||||
uint8_t bsp_analog_i2c_read_byte(void) |
|
||||||
{ |
{ |
||||||
uint8_t i, data = 0; |
unsigned char i,receive=0; |
||||||
|
|
||||||
i2c_sda_high(); |
// SDA_IN(); //SDA设置为输入
|
||||||
SDA_IN(); |
IIC_SDA_Mode_In( pSoftIIC); //SDA设置为输入
|
||||||
for(i = 0; i < 8; i++ ) |
|
||||||
{ |
for(i=0;i<8;i++ ) |
||||||
data <<= 1; |
|
||||||
i2c_scl_high(); |
|
||||||
analog_i2c_delay(); |
|
||||||
if(i2c_read_sda()) |
|
||||||
{ |
{ |
||||||
data++; |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 0);
|
||||||
} |
delay_us(2); |
||||||
i2c_scl_low(); |
GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); |
||||||
analog_i2c_delay(); |
receive<<=1; |
||||||
|
if(IIC_READ_SDA_Pin(pSoftIIC))receive++;
|
||||||
|
// if( READ_SDA() )receive++;
|
||||||
|
|
||||||
|
delay_us(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return data; |
return receive; |
||||||
} |
} |
||||||
|
|
||||||
|
uint8_t IIC_Write_Test(const IIC_SOFT_TypeDef *pSoftIIC , uint8_t reg_addr, uint8_t *buf, uint8_t len) |
||||||
uint8_t bsp_i2c_test_write( uint8_t slave_addr, uint8_t reg_addr, uint8_t *buf, uint8_t len) |
|
||||||
{ |
|
||||||
bsp_analog_i2c_start(); |
|
||||||
//发送器件地址+写命令
|
|
||||||
bsp_analog_i2c_send_byte(slave_addr & 0xFE); |
|
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
|
||||||
{ |
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
return -1; |
|
||||||
} |
|
||||||
//发送写(起始)寄存器地址
|
|
||||||
bsp_analog_i2c_send_byte(reg_addr); |
|
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
|
||||||
{ |
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
return -1; |
|
||||||
} |
|
||||||
//发送写数据
|
|
||||||
for(int i=0; i<len; i++) |
|
||||||
{ |
{ |
||||||
bsp_analog_i2c_send_byte(*buf++); |
IIC_Start(pSoftIIC);
|
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
IIC_Send_Byte(pSoftIIC,pSoftIIC->addr & 0xFE); |
||||||
{ |
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
return -1; |
IIC_Send_Byte(pSoftIIC,reg_addr); |
||||||
} |
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
} |
|
||||||
//停止位
|
IIC_Send_Byte(pSoftIIC,*buf); |
||||||
bsp_analog_i2c_stop(); |
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
|
|
||||||
|
IIC_Stop(pSoftIIC);//产生一个停止条件
|
||||||
|
// HAL_Delay( 200 );
|
||||||
|
// delay_us(6000);
|
||||||
|
return 0; |
||||||
} |
} |
||||||
|
|
||||||
uint8_t bsp_i2c_test_read(uint8_t slave_addr, uint8_t reg_addr, uint8_t *buf, uint8_t len) |
// 寄存器地址 8位置
|
||||||
|
uint8_t IIC_Read_Test(const IIC_SOFT_TypeDef *pSoftIIC, uint8_t reg_addr, uint8_t *buf, uint8_t len) |
||||||
{ |
{ |
||||||
//发送起始位
|
uint8_t temp=0;
|
||||||
bsp_analog_i2c_start(); |
IIC_Start(pSoftIIC);
|
||||||
//发送器件地址+写命令
|
|
||||||
bsp_analog_i2c_send_byte(slave_addr & 0xFE); |
IIC_Send_Byte(pSoftIIC,pSoftIIC->addr & 0xFE); |
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
{ |
|
||||||
bsp_analog_i2c_stop(); |
IIC_Send_Byte(pSoftIIC,reg_addr); |
||||||
return -1; |
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
} |
|
||||||
//发送写(起始)寄存器地址
|
IIC_Start(pSoftIIC);
|
||||||
bsp_analog_i2c_send_byte(reg_addr); |
IIC_Send_Byte(pSoftIIC,pSoftIIC->addr |0x01); //进入接收模式
|
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
if(IIC_Wait_Ack(pSoftIIC)) { IIC_Stop(pSoftIIC); return -1;};
|
||||||
{ |
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
return -1; |
|
||||||
} |
|
||||||
//发送重复起始位
|
|
||||||
bsp_analog_i2c_start(); |
|
||||||
//发送器件地址+读命令
|
|
||||||
bsp_analog_i2c_send_byte(slave_addr | 0x01); |
|
||||||
if(bsp_analog_i2c_wait_ack()) //等待应答
|
|
||||||
{ |
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
return -1; |
|
||||||
} |
|
||||||
//读取数据
|
|
||||||
// for(int i=0; i<len-1; i++)
|
|
||||||
// {
|
|
||||||
// *buf++ = bsp_analog_i2c_read_byte();
|
|
||||||
// }
|
|
||||||
// *buf = bsp_analog_i2c_read_byte(); //最后一位数据发送NACK
|
|
||||||
|
|
||||||
for(int i=0; i<len-1; i++) |
for(int i=0; i<len-1; i++) |
||||||
{ |
{ |
||||||
*buf++ = bsp_analog_i2c_read_byte(); |
*buf=IIC_Read_Byte(pSoftIIC); |
||||||
bsp_analog_i2c_ack(); // 应答
|
IIC_Ack(pSoftIIC); // 应答
|
||||||
|
buf++; |
||||||
} |
} |
||||||
*buf = bsp_analog_i2c_read_byte(); //最后一位数据发送NACK
|
*buf = IIC_Read_Byte(pSoftIIC);// 读非应答
|
||||||
bsp_analog_i2c_nack(); //非应答
|
IIC_NAck(pSoftIIC); |
||||||
//停止位
|
// if(IIC_Wait_Ack()) { IIC_Stop(); return -1;};
|
||||||
bsp_analog_i2c_stop(); |
|
||||||
} |
|
||||||
|
|
||||||
|
IIC_Stop(pSoftIIC); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
// //IIC初始化
|
|
||||||
// void IIC_Init(void)
|
|
||||||
// {
|
|
||||||
// GPIO_InitTypeDef GPIO_Initure;
|
|
||||||
|
|
||||||
// __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
|
|
||||||
|
|
||||||
// //PH4,5初始化设置
|
|
||||||
// GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;
|
|
||||||
// GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
|
|
||||||
// GPIO_Initure.Pull=GPIO_PULLUP; //上拉
|
|
||||||
// GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
|
|
||||||
// HAL_GPIO_Init(GPIOB,&GPIO_Initure);
|
|
||||||
|
|
||||||
// IIC_SDA=1;
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// //产生IIC起始信号
|
|
||||||
// void IIC_Start(void)
|
|
||||||
// {
|
|
||||||
// SDA_OUT(); //sda线输出
|
|
||||||
// IIC_SDA=1;
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// delay_us(4);
|
|
||||||
// IIC_SDA=0;//START:when CLK is high,DATA change form high to low
|
|
||||||
// delay_us(4);
|
|
||||||
// IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
|
|
||||||
// }
|
|
||||||
// //产生IIC停止信号
|
|
||||||
// void IIC_Stop(void)
|
|
||||||
// {
|
|
||||||
// SDA_OUT();//sda线输出
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
|
|
||||||
// delay_us(4);
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// IIC_SDA=1;//发送I2C总线结束信号
|
|
||||||
// delay_us(4);
|
|
||||||
// }
|
|
||||||
// //等待应答信号到来
|
|
||||||
// //返回值:1,接收应答失败
|
|
||||||
// // 0,接收应答成功
|
|
||||||
// uint8_t IIC_Wait_Ack(void)
|
|
||||||
// {
|
|
||||||
// uint8_t ucErrTime=0;
|
|
||||||
// SDA_IN(); //SDA设置为输入
|
|
||||||
// IIC_SDA=1;delay_us(1);
|
|
||||||
// IIC_SCL=1;delay_us(1);
|
|
||||||
// while(READ_SDA)
|
|
||||||
// {
|
|
||||||
// ucErrTime++;
|
|
||||||
// if(ucErrTime>250)
|
|
||||||
// {
|
|
||||||
// IIC_Stop();
|
|
||||||
// return 1;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// IIC_SCL=0;//时钟输出0
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
// //产生ACK应答
|
|
||||||
// void IIC_Ack(void)
|
|
||||||
// {
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// SDA_OUT();
|
|
||||||
// IIC_SDA=0;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// }
|
|
||||||
// //不产生ACK应答
|
|
||||||
// void IIC_NAck(void)
|
|
||||||
// {
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// SDA_OUT();
|
|
||||||
// IIC_SDA=1;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// }
|
|
||||||
// //IIC发送一个字节
|
|
||||||
// //返回从机有无应答
|
|
||||||
// //1,有应答
|
|
||||||
// //0,无应答
|
|
||||||
// void IIC_Send_Byte(uint8_t txd)
|
|
||||||
// {
|
|
||||||
// uint8_t t;
|
|
||||||
// SDA_OUT();
|
|
||||||
// IIC_SCL=0;//拉低时钟开始数据传输
|
|
||||||
// for(t=0;t<8;t++)
|
|
||||||
// {
|
|
||||||
// IIC_SDA=(txd&0x80)>>7;
|
|
||||||
// txd<<=1;
|
|
||||||
// delay_us(2); //对TEA5767这三个延时都是必须的
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// delay_us(2);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
|
|
||||||
// uint8_t IIC_Read_Byte(unsigned char ack)
|
|
||||||
// {
|
|
||||||
// unsigned char i,receive=0;
|
|
||||||
// SDA_IN();//SDA设置为输入
|
|
||||||
// for(i=0;i<8;i++ )
|
|
||||||
// {
|
|
||||||
// IIC_SCL=0;
|
|
||||||
// delay_us(2);
|
|
||||||
// IIC_SCL=1;
|
|
||||||
// receive<<=1;
|
|
||||||
// if(READ_SDA)receive++;
|
|
||||||
// delay_us(1);
|
|
||||||
// }
|
|
||||||
// if (!ack)
|
|
||||||
// IIC_NAck();//发送nACK
|
|
||||||
// else
|
|
||||||
// IIC_Ack(); //发送ACK
|
|
||||||
// return receive;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 兼容软硬i2c
|
|
||||||
|
|
||||||
// /*
|
|
||||||
// * 函数功能:I2C1写寄存器,这是提供给上层的接口
|
|
||||||
// * 输入参数:slave_addr:从机地址
|
|
||||||
// * reg_addr:寄存器地址
|
|
||||||
// * len:写入的长度
|
|
||||||
// * data_ptr:指向要写入的数据
|
|
||||||
// * 返回值 :正常为0,不正常为非0
|
|
||||||
// * 说明 :无
|
|
||||||
// */
|
|
||||||
// int Sensors_I2C1_WriteRegister(unsigned char slave_addr, unsigned char reg_addr, unsigned short len, unsigned char *data_ptr)
|
|
||||||
// {
|
|
||||||
// #ifdef HARDWARE_I2C //硬件I2C
|
|
||||||
// HAL_StatusTypeDef status = HAL_OK;
|
|
||||||
|
|
||||||
// status = HAL_I2C_Mem_Write(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, data_ptr, len, I2Cx_FLAG_TIMEOUT);
|
|
||||||
// //检查通讯状态
|
|
||||||
// if(status != HAL_OK)
|
|
||||||
// {
|
|
||||||
// //总线出错处理
|
|
||||||
// I2C1_Error();
|
|
||||||
// }
|
|
||||||
// while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
// //检查SENSOR是否就绪进行下一次读写操作
|
|
||||||
// while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
|
|
||||||
// //等待传输结束
|
|
||||||
// while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return status;
|
|
||||||
// #else //软件I2C1
|
|
||||||
// //发送起始位
|
|
||||||
// IIC1_Start();
|
|
||||||
// //发送器件地址+写命令
|
|
||||||
// IIC1_Write_Byte(slave_addr & 0xFE);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// //发送写(起始)寄存器地址
|
|
||||||
// IIC1_Write_Byte(reg_addr);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// //发送写数据
|
|
||||||
// for(int i=0; i<len; i++)
|
|
||||||
// {
|
|
||||||
// IIC1_Write_Byte(*data_ptr++);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// //停止位
|
|
||||||
// IIC1_Stop();
|
|
||||||
|
|
||||||
// return 0;
|
|
||||||
// #endif
|
|
||||||
// }
|
|
||||||
|
|
||||||
// /*
|
|
||||||
// * 函数功能:I2C1读寄存器,这是提供给上层的接口
|
|
||||||
// * 输入参数:slave_addr:从机地址
|
|
||||||
// * reg_addr:寄存器地址
|
|
||||||
// * len:要读取的长度
|
|
||||||
// * data_ptr:指向要存储数据的指针
|
|
||||||
// * 返回值 :正常为0,不正常为非0
|
|
||||||
// * 说明 :无
|
|
||||||
// */
|
|
||||||
// int Sensors_I2C1_ReadRegister(unsigned char slave_addr, unsigned char reg_addr, unsigned short len, unsigned char *data_ptr)
|
|
||||||
// {
|
|
||||||
// #ifdef HARDWARE_I2C //硬件I2C
|
|
||||||
// HAL_StatusTypeDef status = HAL_OK;
|
|
||||||
|
|
||||||
// status = HAL_I2C_Mem_Read(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, data_ptr, len, I2Cx_FLAG_TIMEOUT);
|
|
||||||
// //检查通讯状态
|
|
||||||
// if(status != HAL_OK)
|
|
||||||
// {
|
|
||||||
// //总线出错处理
|
|
||||||
// I2C1_Error();
|
|
||||||
// }
|
|
||||||
// while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
// //检查SENSOR是否就绪进行下一次读写操作
|
|
||||||
// while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
|
|
||||||
// //等待传输结束
|
|
||||||
// while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return status;
|
|
||||||
// #else //软件I2C
|
|
||||||
// //发送起始位
|
|
||||||
// IIC1_Start();
|
|
||||||
// //发送器件地址+写命令
|
|
||||||
// IIC1_Write_Byte(slave_addr & 0xFE);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// //发送写(起始)寄存器地址
|
|
||||||
// IIC1_Write_Byte(reg_addr);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// //发送重复起始位
|
|
||||||
// IIC1_Start();
|
|
||||||
// //发送器件地址+读命令
|
|
||||||
// IIC1_Write_Byte(slave_addr | 0x01);
|
|
||||||
// if(IIC1_Wait_Ack()) //等待应答
|
|
||||||
// {
|
|
||||||
// IIC1_Stop();
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
// //读取数据
|
|
||||||
// for(int i=0; i<len-1; i++)
|
|
||||||
// {
|
|
||||||
// *data_ptr++ = IIC1_Read_Byte(1);
|
|
||||||
// }
|
|
||||||
// *data_ptr = IIC1_Read_Byte(0); //最后一位数据发送NACK
|
|
||||||
// //停止位
|
|
||||||
// IIC1_Stop();
|
|
||||||
|
|
||||||
// return 0;
|
|
||||||
// #endif
|
|
||||||
// }
|
|
@ -0,0 +1,193 @@ |
|||||||
|
#include "bsp_spi_soft.h" |
||||||
|
#include "elog.h" |
||||||
|
// #include "delay.h"
|
||||||
|
|
||||||
|
void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI) |
||||||
|
{ |
||||||
|
GPIO_InitTypeDef GPIO_Initure; |
||||||
|
|
||||||
|
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
|
||||||
|
|
||||||
|
// //PB6 SCL PB7初始化设置
|
||||||
|
// GPIO_Initure.Pin = pSoftIIC->scl_pin ;
|
||||||
|
// GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
|
||||||
|
// GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
|
||||||
|
// GPIO_Initure.Speed = GPIO_SPEED_FAST; // 快速
|
||||||
|
// HAL_GPIO_Init( pSoftIIC->scl_port, &GPIO_Initure );
|
||||||
|
|
||||||
|
// // SDA PB7 初始化设置
|
||||||
|
// GPIO_Initure.Pin = pSoftIIC->sda_pin;
|
||||||
|
// HAL_GPIO_Init( pSoftIIC->sda_port, &GPIO_Initure );
|
||||||
|
|
||||||
|
// GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
|
||||||
|
// GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);
|
||||||
|
|
||||||
|
|
||||||
|
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
||||||
|
// GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //457引脚配置为推挽输出
|
||||||
|
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7;//457引脚配置为推挽输出
|
||||||
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
// GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
|
||||||
|
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
|
||||||
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
// GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// //CS引脚初始化
|
||||||
|
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
|
||||||
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
|
||||||
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
// GPIO_Init(GPIOC, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// //SCK和MOSI引脚初始化
|
||||||
|
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
|
||||||
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
|
||||||
|
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
// GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// //MISO引脚初始化
|
||||||
|
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
|
||||||
|
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //浮空输入
|
||||||
|
// GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set SDIO as the input mode |
||||||
|
*/ |
||||||
|
void SDO_IN(void) |
||||||
|
{ |
||||||
|
GPIO_InitTypeDef GPIO_InitStruct = {0}; |
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_1; |
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; |
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP; |
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; |
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); |
||||||
|
} |
||||||
|
/**
|
||||||
|
* @brief Set SDIO as the output mode |
||||||
|
*/ |
||||||
|
void SDO_OUT(void) |
||||||
|
{ |
||||||
|
GPIO_InitTypeDef GPIO_InitStruct; |
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_1; |
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP; |
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; |
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); |
||||||
|
} |
||||||
|
/**
|
||||||
|
* @brief Send one byte by SPI bus |
||||||
|
* |
||||||
|
* @param u8_writedata |
||||||
|
*/ |
||||||
|
void SPI_Write_OneByte(uint8_t u8_writedata) |
||||||
|
{ |
||||||
|
uint8_t i; |
||||||
|
for (i = 0; i < 8; i++) |
||||||
|
{ |
||||||
|
if (u8_writedata & 0x80) |
||||||
|
SDI_H; |
||||||
|
else |
||||||
|
SDI_L; |
||||||
|
SCLK_H; |
||||||
|
u8_writedata <<= 1; |
||||||
|
SCLK_L; |
||||||
|
} |
||||||
|
} |
||||||
|
/**
|
||||||
|
* @brief Read one byte by SPI bus |
||||||
|
* |
||||||
|
* @return temp |
||||||
|
*/ |
||||||
|
uint8_t SPI_Read_OneByte(void) |
||||||
|
{ |
||||||
|
uint8_t i; |
||||||
|
uint8_t temp = 0; |
||||||
|
for (i = 0; i < 8; i++) |
||||||
|
{ |
||||||
|
temp <<= 1; |
||||||
|
SCLK_H; |
||||||
|
if (SDO_R) |
||||||
|
temp |= 0x01; |
||||||
|
else |
||||||
|
temp &= ~0x01; |
||||||
|
SCLK_L; |
||||||
|
} |
||||||
|
return temp; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write a register |
||||||
|
* |
||||||
|
* @param d: {D2, D1, D0} |
||||||
|
* @return SUCCESS |
||||||
|
*/ |
||||||
|
uint8_t WriteReg(uint32_t d) |
||||||
|
{ |
||||||
|
uint8_t tx[3] = {(d >> 16) & 0xff, (d >> 8) & 0xff, d & 0xff}; |
||||||
|
SDO_OUT(); |
||||||
|
CS_L; |
||||||
|
SPI_Write_OneByte(tx[0]); |
||||||
|
SPI_Write_OneByte(tx[1]); |
||||||
|
SPI_Write_OneByte(tx[2]); |
||||||
|
CS_H; |
||||||
|
SDI_L; |
||||||
|
return SUCCESS; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read a register |
||||||
|
* @param d: {D2, D1, D0} |
||||||
|
* @return data: The data be read in a register |
||||||
|
*/ |
||||||
|
uint8_t ReadReg(uint32_t d) |
||||||
|
{ |
||||||
|
uint8_t tx[3] = {(d >> 16) & 0xff, (d >> 8) & 0xff, d & 0xff}; |
||||||
|
uint8_t data; |
||||||
|
// tx[0] = tx[0] | RF_DATA_READ_BIT;
|
||||||
|
// SDO_OUT();
|
||||||
|
// CS_L;
|
||||||
|
// SPI_Write_OneByte(tx[0]);
|
||||||
|
// SPI_Write_OneByte(tx[1]);
|
||||||
|
// SDO_IN();
|
||||||
|
// data = SPI_Read_OneByte();
|
||||||
|
// CS_H;
|
||||||
|
// SDO_OUT();
|
||||||
|
// SDI_L;
|
||||||
|
return data; |
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ,同步传输数据,比如在时钟的上升沿是写数据,那么在时钟的下降沿就是读数据
|
||||||
|
static uint8_t W25QXX_SPI_ReadWriteByte(uint8_t TxData) |
||||||
|
{ |
||||||
|
int i = 0; |
||||||
|
uint8_t RxData = 0; |
||||||
|
W25QXX_SCK_L(); // 时钟拉低
|
||||||
|
for(i = 7; i >= 0; i--) |
||||||
|
{ |
||||||
|
W25QXX_SCK_L(); // 时钟拉低 ,发送1bit
|
||||||
|
if(TxData & (1 << i)) |
||||||
|
{ |
||||||
|
W25QXX_MOSI_H(); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
W25QXX_MOSI_L(); |
||||||
|
} |
||||||
|
delay_us(1); // 延时1微秒
|
||||||
|
W25QXX_SCK_H(); // 拉高时钟读 1bit
|
||||||
|
RxData <<= 1; |
||||||
|
RxData |= W25QXX_MISO_GET(); |
||||||
|
delay_us(1); |
||||||
|
} |
||||||
|
W25QXX_SCK_L(); |
||||||
|
return RxData; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/ |
Loading…
Reference in new issue