Changeset - 0dd5c923fdea
[Not reviewed]
default
0 5 0
Ethan Zonca - 10 years ago 2016-01-19 22:08:19
ez@ethanzonca.com
i2c comms still not working
5 files changed with 34 insertions and 11 deletions:
0 comments (0 inline, 0 general)
inc/gpio.h
Show inline comments
 
#ifndef __gpio_H
 
#define __gpio_H
 
 
#include "stm32f0xx_hal.h"
 
 
 
#define OSC_EN_Pin GPIO_PIN_1
 
#define OSC_EN_GPIO_Port GPIOF
 
#define OSC_NOTEN OSC_EN_GPIO_Port , OSC_EN_Pin
 
 
#define VBATT_SENSE_Pin GPIO_PIN_6
 
#define VBATT_SENSE_GPIO_Port GPIOA
 
 
#define LED_BLUE_Pin GPIO_PIN_0
 
#define LED_BLUE_GPIO_Port GPIOB
 
#define LED_BLUE LED_BLUE_GPIO_Port , LED_BLUE_Pin
 
 
#define TCXO_EN_Pin GPIO_PIN_8
 
#define TCXO_EN_GPIO_Port GPIOA
 
#define TCXO_EN TCXO_EN_GPIO_Port  , TCXO_EN_Pin
 
 
 
void MX_GPIO_Init(void);
 
void gpio_init(void);
 
void led_blink(uint8_t n);
 
 
#endif 
 
lib/si5351/si5351.c
Show inline comments
 
@@ -4,48 +4,50 @@
 
 * Copyright (C) 2015 Jason Milldrum <milldrum@gmail.com>
 
 *                    Dana H. Myers <k6jq@comcast.net>
 
 *
 
 * Some tuning algorithms derived from clk-si5351.c in the Linux kernel.
 
 * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
 
 * Rabeeh Khoury <rabeeh@solid-run.com>
 
 *
 
 * This program is free software: you can redistribute it and/or modify
 
 * it under the terms of the GNU General Public License as published by
 
 * the Free Software Foundation, either version 3 of the License, or
 
 * (at your option) any later version.
 
 *
 
 * This program is distributed in the hope that it will be useful,
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
 * GNU General Public License for more details.
 
 *
 
 * You should have received a copy of the GNU General Public License
 
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 

	
 
#include <stdint.h>
 
#include "stm32f0xx_hal.h"
 
#include "si5351.h"
 
#include "gpio.h"
 

	
 

	
 
// Private prototypes
 
uint64_t si5351_pll_calc(uint64_t, struct Si5351RegSet *, int32_t);
 
uint64_t si5351_multisynth_calc(uint64_t, uint64_t, struct Si5351RegSet *);
 
void si5351_update_sys_status(struct Si5351Status *);
 
void si5351_update_int_status(struct Si5351IntStatus *);
 
void si5351_ms_div(enum si5351_clock, uint8_t, uint8_t);
 
uint8_t si5351_select_r_div(uint64_t *);
 

	
 
// Globals
 
int32_t ref_correction;
 
uint8_t lock_plla, lock_pllb;
 
uint32_t xtal_freq;
 

	
 
uint64_t plla_freq;
 
uint64_t pllb_freq;
 
uint64_t clk0_freq;
 
uint64_t clk1_freq;
 
uint64_t clk2_freq;
 
uint8_t clk0_int_mode, clk1_int_mode, clk2_int_mode;
 

	
 
struct Si5351Status dev_status;
 
struct Si5351IntStatus dev_int_status;
 

	
 
@@ -888,81 +890,91 @@ void si5351_set_clock_fanout(enum si5351
 
	case SI5351_FANOUT_MS:
 
		if(enable)
 
		{
 
			reg_val |= SI5351_MULTISYNTH_ENABLE;
 
		}
 
		else
 
		{
 
			reg_val &= ~(SI5351_MULTISYNTH_ENABLE);
 
		}
 
		break;
 
	}
 
	
 
	si5351_write(SI5351_FANOUT_ENABLE, reg_val);
 
}
 

	
 

	
 

	
 

	
 
/* AAAH REFREAKINGIMPLEMENT WITH COMMON STANDARD I2C THINGS:
 
~/Projects/featherhab-fw/libopencm3/lib/stm32/common/i2c_common_all.c
 
*/
 

	
 
uint8_t si5351_write_bulk(uint8_t addr, uint8_t bytes, uint8_t *data)
 
{
 
    HAL_I2C_Mem_Write(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data, bytes, 100);
 
    HAL_Delay(300);
 
    uint32_t res = HAL_I2C_Mem_Write(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data, bytes, 100);
 
    led_blink(res);
 
    HAL_Delay(300);
 

	
 

	
 

	
 
/*
 
	Wire.beginTransmission(SI5351_BUS_BASE_ADDR);
 
	Wire.write(addr);
 
	for(int i = 0; i < bytes; i++)
 
	{
 
		Wire.write(data[i]);
 
	}
 
	Wire.endTransmission();
 
*/
 
}
 

	
 
uint8_t si5351_write(uint8_t addr, uint8_t data)
 
{
 
    HAL_Delay(300);
 
    uint8_t data_arr[1] = {data};
 
    HAL_I2C_Mem_Write(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data, 1, 100);
 
    uint8_t res = HAL_I2C_Mem_Write(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data, 1, 100);
 

	
 
    led_blink(res);
 
    HAL_Delay(300);
 
/*
 
	Wire.beginTransmission(SI5351_BUS_BASE_ADDR);
 
	Wire.write(addr);
 
	Wire.write(data);
 
	Wire.endTransmission();
 
*/
 
}
 

	
 
uint8_t si5351_read(uint8_t addr)
 
{
 
	uint8_t data_arr[1] = {0};
 

	
 
    HAL_I2C_Mem_Read(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data_arr, 1, 100);
 
    HAL_Delay(300);
 
    uint8_t res = HAL_I2C_Mem_Read(si5351_i2cport, SI5351_BUS_BASE_ADDR, addr, 1, data_arr, 1, 100);
 

	
 
    led_blink(res);
 
    HAL_Delay(300);
 
/*
 
	Wire.beginTransmission(SI5351_BUS_BASE_ADDR);
 
	Wire.write(addr);
 
	Wire.endTransmission();
 

	
 
	Wire.requestFrom(SI5351_BUS_BASE_ADDR, 1, false);
 

	
 
	while(Wire.available())
 
	{
 
		reg_val = Wire.read();
 
	}
 
*/	
 
	return data_arr[1];
 
}
 

	
 
/*********************/
 
/* Private functions */
 
/*********************/
 

	
 
uint64_t si5351_pll_calc(uint64_t freq, struct Si5351RegSet *reg, int32_t correction)
 
{
 
	uint64_t ref_freq = xtal_freq * SI5351_FREQ_MULT;
 
	uint32_t a, b, c, p1, p2, p3;
 
	uint64_t lltmp, rfrac, denom;
src/gpio.c
Show inline comments
 
#include "gpio.h"
 
 
void MX_GPIO_Init(void)
 
void gpio_init(void)
 
{
 
 
  GPIO_InitTypeDef GPIO_InitStruct;
 
 
  /* GPIO Ports Clock Enable */
 
  __GPIOF_CLK_ENABLE();
 
  __GPIOA_CLK_ENABLE();
 
  __GPIOB_CLK_ENABLE();
 
 
  /*Configure GPIO pins : PFPin PFPin */
 
  GPIO_InitStruct.Pin = OSC_EN_Pin;
 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
 
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
 
 
  /*Configure GPIO pins : PA0 PA2 PA3 PA4 
 
                           PA5 PA7 PA15 */
 
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4 
 
                          |GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_15;
 
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 
@@ -32,24 +32,34 @@ void MX_GPIO_Init(void)
 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 
  /*Configure GPIO pin : PtPin */
 
  GPIO_InitStruct.Pin = LED_BLUE_Pin;
 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
 
  HAL_GPIO_Init(LED_BLUE_GPIO_Port, &GPIO_InitStruct);
 
 
  /*Configure GPIO pins : PB1 PB3 PB4 PB5 */
 
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
 
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 
  /*Configure GPIO pin : PtPin */
 
  GPIO_InitStruct.Pin = TCXO_EN_Pin;
 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
 
  HAL_GPIO_Init(TCXO_EN_GPIO_Port, &GPIO_InitStruct);
 
 
}
 
 
void led_blink(uint8_t n)
 
{
 
    for(int i = 0; i < n; i++)
 
    {
 
        HAL_GPIO_WritePin(LED_BLUE, 1);
 
        HAL_Delay(100);
 
        HAL_GPIO_WritePin(LED_BLUE, 0);
 
        HAL_Delay(100);
 
    }
 
}
src/i2c.c
Show inline comments
 
//
 
// I2C: Initialize I2C peripheral and return a reference to the port
 
//
 
 
#include "i2c.h"
 
#include "gpio.h"
 
 
I2C_HandleTypeDef hi2c1;
 
 
void i2c_init(void)
 
{
 
    __GPIOA_CLK_ENABLE();
 
 
    GPIO_InitTypeDef GPIO_InitStruct;
 
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 
    GPIO_InitStruct.Pull = GPIO_PULLUP;
 
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
 
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
 
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 
    __I2C1_CLK_ENABLE();
 
 
    hi2c1.Instance = I2C1;
 
    hi2c1.Init.Timing = 0x2000090E;
 
    hi2c1.Init.OwnAddress1 = 0;
 
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
 
    hi2c1.Init.OwnAddress2 = 0;
 
    hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
 
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
 
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
 
    HAL_I2C_Init(&hi2c1);
 
 
    HAL_I2CEx_AnalogFilter_Config(&hi2c1, I2C_ANALOGFILTER_ENABLED);
 
}
 
 
 
// Get pointer to I2C port
 
inline I2C_HandleTypeDef* i2c_get(void)
 
I2C_HandleTypeDef* i2c_get(void)
 
{
 
    return &hi2c1;
 
}
src/main.c
Show inline comments
 
#include "stm32f0xx_hal.h"
 
#include "si5351.h"
 
#include "jtencode.h"
 
#include "adc.h"
 
#include "dma.h"
 
#include "i2c.h"
 
#include "usart.h"
 
#include "gpio.h"
 
#include "gps.h"
 
 
 
void sysclk_init(void);
 
 
 
char call[7] = "N0CALL";
 
char loc[5] = "AA00";
 
uint8_t dbm = 27;
 
uint8_t tx_buffer[255];
 
 
int main(void)
 
{
 
 
    HAL_Init();
 
 
    sysclk_init();
 
    MX_GPIO_Init();
 
    gpio_init();
 
    led_blink(5);
 
    MX_DMA_Init();
 
    MX_ADC_Init();
 
    i2c_init();
 
 
    HAL_GPIO_WritePin(OSC_NOTEN, 0);
 
    HAL_GPIO_WritePin(TCXO_EN, 1);
 
    HAL_Delay(100);
 
 
//    MX_USART1_UART_Init();
 
 
 
    //jtencode_init();
 
    //gps_init();
 
    si5351_init(i2c_get(), SI5351_CRYSTAL_LOAD_8PF, 0);
 
    si5351_set_correction(0);
 
 
 
    si5351_set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
 
    si5351_set_ms_source(SI5351_CLK0, SI5351_PLLA);
 
 
    si5351_set_freq(100000UL * 100, 0, SI5351_CLK0);
 
 
    si5351_drive_strength(SI5351_CLK0, SI5351_DRIVE_2MA); // Set for max power if desired (8ma max)
 
    si5351_output_enable(SI5351_CLK0, 1); // Disable the clock initially
 
    //wspr_encode(call, loc, dbm, tx_buffer);
 
 
    si5351_pll_reset(SI5351_PLLA);
 
 
    uint32_t led_timer = HAL_GetTick();
 
    uint32_t last_gps  = HAL_GetTick();
 
 
    while (1)
 
    {
 
        if(HAL_GetTick() - led_timer > 100)
 
        {
 
@@ -82,27 +81,26 @@ void sysclk_init(void)
 
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 
    RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
 
    RCC_OscInitStruct.HSICalibrationValue = 16;
 
    RCC_OscInitStruct.HSI14CalibrationValue = 16;
 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
 
 
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
 
 
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
 
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
 
    PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
 
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
 
 
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
 
 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 
 
    // SysTick_IRQn interrupt configuration 
 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
 
 
}
 
0 comments (0 inline, 0 general)