mirror of
				https://github.com/IcedRooibos/py32f0-template.git
				synced 2025-10-30 17:32:05 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // This example was tested with 'PY32F003W16S6TU SOP16' chip
 | |
| //
 | |
| // It uses a modded version of the https://github.com/bob-01/STM32-SI5351/tree/master
 | |
| // library.
 | |
| 
 | |
| #include "py32f0xx_bsp_printf.h"
 | |
| 
 | |
| #include "si5351.h"
 | |
| 
 | |
| #define I2C_ADDRESS 0xC0 // 0x60
 | |
| 
 | |
| I2C_HandleTypeDef hi2c1;
 | |
| 
 | |
| void APP_ErrorHandler(void);
 | |
| static void APP_I2C_Config(void);
 | |
| 
 | |
| void I2C_Scan() {
 | |
|   printf("Scanning I2C bus...\r\n");
 | |
| 
 | |
|   HAL_StatusTypeDef res;
 | |
|   int found = 0;
 | |
| 
 | |
|   for (uint16_t i = 0; i < 128; i++) {
 | |
|     res = HAL_I2C_IsDeviceReady(&hi2c1, i << 1, 1, 10);
 | |
|     if (res == HAL_OK) {
 | |
|       char msg[64];
 | |
|       found = 1;
 | |
|       snprintf(msg, sizeof(msg), "Found at 0x%02X\n", i);
 | |
|       printf(msg);
 | |
|     }
 | |
|   }
 | |
|   if (!found)
 | |
|     printf("An I2C device was not found - check connections!\n");
 | |
| }
 | |
| 
 | |
| int main(void)
 | |
| {
 | |
|   HAL_Init();
 | |
| 
 | |
|   // PA2 ------> USART2_TX
 | |
|   BSP_USART_Config();
 | |
|   printf("SystemClk:%ld\r\n", SystemCoreClock);
 | |
| 
 | |
|   APP_I2C_Config();
 | |
| 
 | |
|   // HAL_Delay(5000);
 | |
| 
 | |
|   I2C_Scan();
 | |
| 
 | |
|   int32_t si5351_FREQ_CORR = 0;
 | |
|   uint8_t si5351_XTAL = 26; // I am using a 26 MHz TCXO, change according to your Si5351 setup
 | |
| 
 | |
|   si5351_init(&hi2c1, SI5351_BUS_BASE_ADDR, SI5351_CRYSTAL_LOAD_0PF, si5351_XTAL*1000000, si5351_FREQ_CORR);
 | |
|   si5351_drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);
 | |
|   si5351_drive_strength(SI5351_CLK1, SI5351_DRIVE_8MA);
 | |
|   si5351_drive_strength(SI5351_CLK2, SI5351_DRIVE_8MA);
 | |
| 
 | |
|   si5351_set_freq(28074000*100ULL, SI5351_CLK0); // FT8 frequency on the 10m band
 | |
| 
 | |
|   while(1) {
 | |
|     HAL_Delay(10);
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void APP_I2C_Config(void)
 | |
| {
 | |
|   hi2c1.Instance             = I2C;
 | |
|   hi2c1.Init.ClockSpeed      = 100000;        // 100KHz ~ 400KHz
 | |
|   hi2c1.Init.DutyCycle       = I2C_DUTYCYCLE_2;
 | |
|   hi2c1.Init.OwnAddress1     = 0;
 | |
|   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 | |
|   hi2c1.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
 | |
|   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
 | |
|   {
 | |
|     APP_ErrorHandler();
 | |
|   }
 | |
| }
 | |
| 
 | |
| void APP_ErrorHandler(void)
 | |
| {
 | |
|   while (1);
 | |
| }
 | |
| 
 | |
| #ifdef  USE_FULL_ASSERT
 | |
| /**
 | |
|   * @brief  Export assert error source and line number
 | |
|   */
 | |
| void assert_failed(uint8_t *file, uint32_t line)
 | |
| {
 | |
|   /* printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 | |
|   while (1);
 | |
| }
 | |
| #endif /* USE_FULL_ASSERT */
 | 
