136 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "stm32f7xx_hal.h"
 | |
| #include "ext_26pin.h"
 | |
| 
 | |
| SPI_HandleTypeDef hspi2;
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_Debug_Init (void) {
 | |
|   GPIO_InitTypeDef GPIO_InitStruct;
 | |
| 
 | |
|   /* GPIO Ports Clock Enable */
 | |
|   __HAL_RCC_GPIOF_CLK_ENABLE();
 | |
| 
 | |
|   /* Configure GPIO pin: PF9 (GPIO_DEBUG) */
 | |
|   GPIO_InitStruct.Pin  = GPIO_PIN_9;
 | |
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | |
|   GPIO_InitStruct.Pull = GPIO_NOPULL;
 | |
|   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| int32_t Ext_FreqGen_Init (void)
 | |
| {
 | |
|   GPIO_InitTypeDef GPIO_InitStruct;
 | |
| 
 | |
|   /* GPIO Ports Clock Enable */
 | |
|   __HAL_RCC_GPIOF_CLK_ENABLE();	
 | |
|   __HAL_RCC_GPIOI_CLK_ENABLE();	
 | |
|   __HAL_RCC_GPIOB_CLK_ENABLE();	
 | |
| 	
 | |
|   /*Configure GPIO pin Output Level */
 | |
|   HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_SET);
 | |
| 	
 | |
|   /*Configure GPIO pin : nCS_FREQ_GEN_Pin */
 | |
|   GPIO_InitStruct.Pin = nCS_FREQ_GEN_Pin;
 | |
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | |
|   GPIO_InitStruct.Pull = GPIO_NOPULL;
 | |
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | |
|   HAL_GPIO_Init(nCS_FREQ_GEN_GPIO_Port, &GPIO_InitStruct);
 | |
| 
 | |
| 	
 | |
|   __HAL_RCC_SPI2_CLK_ENABLE();
 | |
|   
 | |
|    /**SPI2 GPIO Configuration    
 | |
|    PI1     ------> SPI2_SCK
 | |
|    PB15     ------> SPI2_MOSI 
 | |
|     */
 | |
|     GPIO_InitStruct.Pin = GPIO_PIN_1;
 | |
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | |
|     GPIO_InitStruct.Pull = GPIO_NOPULL;
 | |
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | |
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | |
|     HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
 | |
| 
 | |
|     GPIO_InitStruct.Pin = GPIO_PIN_15;
 | |
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | |
|     GPIO_InitStruct.Pull = GPIO_NOPULL;
 | |
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | |
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | |
|     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | |
| 
 | |
| 	
 | |
|   /* SPI2 parameter configuration*/
 | |
|   hspi2.Instance = SPI2;
 | |
|   hspi2.Init.Mode = SPI_MODE_MASTER;
 | |
|   hspi2.Init.Direction = SPI_DIRECTION_2LINES;
 | |
|   hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
 | |
|   hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
 | |
|   hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
 | |
|   hspi2.Init.NSS = SPI_NSS_SOFT;
 | |
|   hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
 | |
|   hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | |
|   hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
 | |
|   hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | |
|   hspi2.Init.CRCPolynomial = 7;
 | |
|   hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
 | |
|   hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
 | |
|   if (HAL_SPI_Init(&hspi2) != HAL_OK)	
 | |
| 		return -1;
 | |
|   Ext_FreqGen_Set(20,SQUARE);
 | |
|   Ext_FreqGen_Set(20,SQUARE);
 | |
| 	return 0;
 | |
| }
 | |
| //------------------------------------------------------------------------------
 | |
| //------------------------------------------------------------------------------
 | |
| void Ext_FreqGen_Set(uint32_t frequency,f_mode mode)
 | |
| {
 | |
| 	uint8_t data[2];
 | |
| 	float calcDivisor;
 | |
| 	uint32_t divisorInt;
 | |
| 	calcDivisor = ((float)frequency * 268435456L) / 16000000L;
 | |
| 	divisorInt = (uint32_t)calcDivisor + 1;
 | |
| 	//----------------------------------------------------------------------------
 | |
| 	// reset generator
 | |
| 	data[0] = 0x21;
 | |
| 	data[1] = 0x00;
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_RESET);
 | |
| 	HAL_SPI_Transmit(&hspi2,data,2,10);
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_SET);
 | |
| 	//----------------------------------------------------------------------------
 | |
| 	// set frequency LSB (14 bits)
 | |
| 	data[0] = ((divisorInt & 0x3FFF) | 0x4000) >> 8;
 | |
| 	data[1] = ((divisorInt & 0x3FFF) | 0x4000) >> 0;
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_RESET);
 | |
| 	HAL_SPI_Transmit(&hspi2,data,2,10);
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_SET);
 | |
| 	//----------------------------------------------------------------------------
 | |
| 	// set frequency MSB (14 bits)
 | |
| 	data[0] = (((divisorInt>>14) & 0x3FFF) | 0x4000) >> 8;
 | |
| 	data[1] = (((divisorInt>>14) & 0x3FFF) | 0x4000) >> 0;
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_RESET);
 | |
| 	HAL_SPI_Transmit(&hspi2,data,2,10);
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_SET);
 | |
| 	//----------------------------------------------------------------------------
 | |
| 	// set output signal
 | |
| 	data[0] = 0x20;		// unreset
 | |
| 	switch(mode)
 | |
| 	{
 | |
| 		case SINUS:
 | |
| 			data[1] = 0x00;
 | |
| 			break;		
 | |
| 		case TRIANGLE:
 | |
| 			data[1] = 0x02;
 | |
| 			break;		
 | |
| 		case SQUARE:
 | |
| 			data[1] = 0x28;
 | |
| 			break;
 | |
| 	}
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_RESET);
 | |
| 	HAL_SPI_Transmit(&hspi2,data,2,10);
 | |
| 	HAL_GPIO_WritePin(nCS_FREQ_GEN_GPIO_Port, nCS_FREQ_GEN_Pin, GPIO_PIN_SET);
 | |
| }
 |