littleshrimp 发表于 2019-4-3 18:52
你要把这个改成和stm32对应的 程序我发了一个rar包 那个就是我当时测试的
对应的话,也就是把最下面的操作SPI引脚的操作相应的修改一下,那些操作我都修改并且测试过了,但是初始化还是不成功,下面是我的代码,我搞底层的东西有些头疼
#define SCLK_Pin GPIO_PIN_0
#define SCLK_GPIO_Port GPIOA
#define SDO_Pin GPIO_PIN_1
#define SDO_GPIO_Port GPIOA
#define SDIO_Pin GPIO_PIN_2
#define SDIO_GPIO_Port GPIOA
#define CS_Pin GPIO_PIN_3
#define CS_GPIO_Port GPIOA
#define TRIGGER_Pin GPIO_PIN_4
#define TRIGGER_GPIO_Port GPIOA
#define RESET_Pin GPIO_PIN_5
#define RESET_GPIO_Port GPIOA
/* USER CODE BEGIN Private defines */
#define SPI_SCLK_LOW() GPIOA->ODR&=0XFFFE; //PA0拉低
#define SPI_SCLK_HIGH() GPIOA->BSRR=0X0001; //PA0拉高
#define SPI_SDO_LOW() GPIOA->ODR&=0XFFFD; //A1
#define SPI_SDO_HIGH() GPIOA->BSRR=0X0002;
#define SPI_SDI() HAL_GPIO_ReadPin( GPIOA , GPIO_PIN_2 )
//#define SPI_SDI_INIT() HAL_GPIO_WritePin( &GPIOA, SCLK_Pin , SET);
#define CS_LOW() GPIOA->ODR&=0XFFF7; //A3
#define CS_HI() GPIOA->BSRR=0X0008;
#define TRIGGER_LOW() GPIOA->ODR&=0XFFEF; //A4
#define TRIGGER_HI() GPIOA->BSRR=0X0010;
#define REST_LOW() GPIOA->ODR&=0XFFDF; //A5
#define REST_HI() GPIOA->BSRR=0X0020;
/*下面是main函数*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
/* USER CODE BEGIN Includes */
#include
#include "hal_spi.h"
#include "stdbool.h"
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t a=0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
#define SRAM_START_ADDRESS 0x6000
#define SRAM_END_ADDRESS 0x6FFF
const uint32_t PAT_TYPE = 0x001F0000;//模式连续运行。
//RSET如果不设置成1F输出波形会变形
const uint32_t DACRSET = 0x000c9f1F;//DAC_RSET_EN,
//const uint32_t DACRSET = 0x000c1f00;//DAC_RSET_EN = 0,
//正弦波输出
const uint32_t WAV_CONFIG = 0x00271031;//DDS输出,预存波形
//锯齿波输出
//const uint32_t WAV_CONFIG = 0x00270011;//锯齿波,预存波形
const uint32_t SAW_CONFIG = 0x003700FC;//上斜坡锯齿波
//数字增益影响输出波形的幅度,应该是二进制补码,范围是+-2048
const uint32_t DAC_DGAIN = 0x00354000;//Data=0x4000 Very important,the maximum value is 0x4000
const uint32_t DDS_TW32 = 0x003E006C;//Register 0x3E, Data=0x0E38
const uint32_t DDS_TW1 = 0x003FE600;//Register 0x3F, Data=0xE600 5MHz output,50MHz fsys
const uint32_t PAT_STATUS = 0x001E0001;//PAT_STATUS 0x1E, run bit=1 Very important
const uint32_t RAMUPDATE = 0x001D0001;//用新配置更新所有SPI设置(自清零)
uint8_t buf[5];
char sbuf[50];
void hal_spi_write_uint32(uint32_t data)
{
CS_LOW( );
hal_spi_read_write_byte(data >> 24);
hal_spi_read_write_byte(data >> 16);
hal_spi_read_write_byte(data >> 8);
hal_spi_read_write_byte(data);
CS_HI( );
}
void hal_spi_write_uint16(uint16_t addr,uint16_t data)
{
CS_LOW( );
hal_spi_read_write_byte(addr >> 8);
hal_spi_read_write_byte(addr);
hal_spi_read_write_byte(data >> 8);
hal_spi_read_write_byte(data);
CS_HI( );
}
void ad9102_init(void)
{
CS_HI( );
TRIGGER_HI();
REST_LOW();
// __delay_cycles(65500);
HAL_Delay(200);
REST_HI();
hal_spi_write_uint32(PAT_TYPE);
// hal_spi_read_write_byte
hal_spi_write_uint32(DACRSET);
hal_spi_write_uint32(WAV_CONFIG);
hal_spi_write_uint32(SAW_CONFIG);
hal_spi_write_uint32(DAC_DGAIN);
hal_spi_write_uint32(DDS_TW32);
hal_spi_write_uint32(DDS_TW1);
hal_spi_write_uint32(RAMUPDATE);
hal_spi_write_uint32(PAT_STATUS);
hal_spi_write_uint32(RAMUPDATE);
HAL_Delay(10);
TRIGGER_LOW();
hal_spi_write_uint32(RAMUPDATE);
}
/* USER CODE END 0 */
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();
/* USER CODE BEGIN 2 */
ad9102_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(2);
}
/* USER CODE END 3 */
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/**Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, SCLK_Pin|SDO_Pin|CS_Pin|TRIGGER_Pin
|RESET_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : SCLK_Pin SDO_Pin CS_Pin TRIGGER_Pin
RESET_Pin */
GPIO_InitStruct.Pin = SCLK_Pin|SDO_Pin|CS_Pin|TRIGGER_Pin
|RESET_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : SDIO_Pin */
GPIO_InitStruct.Pin = SDIO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(SDIO_GPIO_Port, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void _Error_Handler(char * file, int line)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
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
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
/*上面是main函数*/
/*相关SPI*/
#include "hal_spi.h"
#include "main.h"
#include "stm32f4xx_hal.h"
void hal_delay_us1(uint16_t us)
{
uint16_t i=us*16;
while(i>0)
i--;
}
//void hal_spi_init(void)
//{
// SPI_SDI_INIT();
//}
uint8_t hal_spi_read_write_byte(uint8_t tx_byte)
{
unsigned char i,temp=0;
SPI_SCLK_LOW();
hal_delay_us1(1);
for(i=0;i