1,H文件
/*
* adns-5050.h
*
* Created on: Sep 3, 2024
* Author: ll
*/
#include "main.h"
#ifndef INC_ADNS_5050_H_
#define INC_ADNS_5050_H_
#define PROD_ID 0x00 //R
#define REV_ID 0x01 //R
#define MOTION_ST 0x02 //R 自上次读取是否发生了移动0为未移动,8位二进制补码
#define DELTA_X 0x03 //R
#define DELTA_Y 0x04 //R
#define SQUAL 0x05 //R 表面质量0为无,最大128
#define SHUT_HI 0x06 //R 当前帧的最大像素值
#define SHUT_LO 0x07 //R
#define PIX_MAX 0x08 //R
#define PIX_SUM 0x09 //R
#define PIX_MIN 0x0a //R
#define PIX_GRAB 0x0b //R/W 连续读取361次,任何写入都将重置
#define MOUSE_CTRL 0x0d //R/W 最低位为0时CPI为500(默认)为1时1000;第一位为0(默认)时开启电源,1时关闭
#define MOUSE_CTRL2 0x019 //R/W 第4位为1时,0-3位表示CPI
#define LED_DC_MODE 0x022 //R/W 写入0x80将强制直流模式,00为自动亮度
#define CHIP_RESET 0x3A //W
#define PROD_ID2 0x26 //R
#define INV_REV_ID 0x3F //R
#define MOTION_BURST 0x63 //R
/*
MOUSE_CTRL2
Bit 7 6 5 4 3 2 1 0
Field Reserved Reserved Reserved RES_EN RES RES RES RES
RES_EN = 0 Disable RES[3:0] setting.
= 1 Enable RES[3:0] setting.
RES [3:0] = 0b0001: 125 CPI
= 0b0010: 250 CPI
= 0b0011: 375 CPI
= 0b0100: 500 CPI
= 0b0101: 625 CPI
= 0b0110: 750 CPI
= 0b0111: 875 CPI
= 0b1000: 1000 CPI
= 0b1001: 1125 CPI
= 0b1010: 1250 CPI
= 0b1011: 1375 CPI
先把第4位设置为1,然后设置低3位。
*/
/*
PIX_GRAB 的读取结果顺序:
18 37 ... 322 341 360
17 36 ... 359
16 35 358
.
.
.
2 21
1 20
0 19 342
其0-6位为数据,最高位为有效性标志
*/
#define SPI_SCK_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET) /* SCK = 1 */
#define SPI_SCK_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_RESET) /* SCK = 0 */
#define SPI_CS_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET) /* SCK = 1 */
#define SPI_CS_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET) /* SCK = 0 */
#define SPI_RES_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_SET) /* SCK = 1 */
#define SPI_RES_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET) /* SCK = 0 */
void SPI_IoInit(void);
void adns5050_reset(void);
uint8_t spi_read_register(uint8_t adr);
void spi_write_register(uint8_t adr,uint8_t value);
#endif /* INC_ADNS_5050_H_ */
2,C文件
#include "adns-5050.h"
#include "tim.h"
#include "main.h"
/*
* gpio 模拟单线spi
*
* CLK PD15
* SDIO PD14
* NCS PD12
* RESET PD11
*
* */
void SPI_IoInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pins : PD9 PD11 PD12 PD14
PD15 PD4 */
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
}
void adns5050_reset(void) //ADNS3080 复位(高)
{
SPI_RES_HIGH;
HAL_Delay(1);
SPI_RES_LOW;
HAL_Delay(1);
SPI_RES_HIGH;
HAL_Delay(100);
}
void adns5050_sync(void) //ADNS3080 复位(高)
{
SPI_CS_HIGH;
HAL_Delay(2);
SPI_CS_LOW;
HAL_Delay(2);
SPI_CS_HIGH;
HAL_Delay(2);
}
void SPI_IoInput(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void SPI_IoOutput(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
uint8_t spi_read_register(uint8_t adr)
{
uint8_t temp=0;
adr = adr&0x7f ;
SPI_CS_LOW;
SPI_IoOutput();
for(char i=0;i<8;i++)
{
SPI_SCK_LOW;
delay_us(1);
if (adr & (1 << (7 - i))) {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
}
delay_us(1);
SPI_SCK_HIGH;
delay_us(1);
}
SPI_IoInput();
delay_us(10);
for(char i=0;i<8;i++)
{
SPI_SCK_LOW;
delay_us(1);
SPI_SCK_HIGH;
delay_us(1);
if (HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_14) == GPIO_PIN_SET) {
temp |= (1 << (7 - i));
}
}
delay_us(20);
SPI_CS_HIGH;
return temp;
}
void spi_write_register(uint8_t adr,uint8_t value)
{
//adr |= 0x80;
SPI_CS_LOW;
HAL_Delay(2);
for(char i=0;i<8;i++)
{
SPI_SCK_LOW;
if (adr & (1 << (7 - i))) {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
}
delay_us(1);
SPI_SCK_HIGH;
delay_us(1);
}
//delay_us(1);
for(char i=0;i<8;i++)
{
SPI_SCK_LOW;
if (value & (1 << (7 - i))) {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
}
delay_us(1);
SPI_SCK_HIGH;
delay_us(1);
}
delay_us(20);
SPI_CS_HIGH;
}
3,main文件
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "iwdg.h"
#include "lwip.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "uudp.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "tcp.h"
#include "mtf02.h"
#include "adns-5050.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
NRF_Struct nrf_struct;
NRF_LocationFlush lca;
struct tcp_pcb *client_pcb = NULL; //这一句一定要放在里面,否则会没用
uint8_t USART_RX_BUF[30]={0};
uint16_t USART_RX_CNT=0;
uint8_t USART_RX_FLAG=0;
uint8_t Net_buff[2048]={0};
uint16_t Net_buffnum=0;
uint8_t Net_buff_FLAG=0;
uint8_t mouse_dx=0;
uint8_t mouse_dy=0;
uint8_t mousebuf=0;
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI1_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
MX_LWIP_Init();
MX_USART2_UART_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim6);
printf("Init SUCCESS/usart test\r\n");
// NRF_Check();
HAL_Delay(100);
//TCP_Client_Init();
udp_client_init();
SPI_IoInit();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
MX_LWIP_Process();
if(Net_buffnum!=0) //网络接收的数据转发
{
//HAL_UART_Transmit(&huart2,Net_buff,Net_buffnum,10000); //422转发
Net_buffnum=0;
adns5050_sync();
HAL_Delay(10);
adns5050_reset();
printf("spi_read_register %x\r\n", spi_read_register(PROD_ID));
}
mouse_dx =spi_read_register(DELTA_X);
HAL_Delay(1);
mouse_dy =spi_read_register(DELTA_Y);
sprintf(mousebuf,"vel_x: %d vel_y: %d \r\n",mouse_dx, mouse_dy);
udp_client_send(mousebuf);
if(USART_RX_FLAG==1) //接收光流传感器的数据转发给以太网
{
USART_RX_FLAG=0;
for(int i=0;i<27;i++)
{
micolink_decode(USART_RX_BUF[i]);
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */