diff Small_CPU/Src/i2c.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children a6f0881074a4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Small_CPU/Src/i2c.c	Sat Apr 28 11:52:34 2018 +0200
@@ -0,0 +1,173 @@
+#include "baseCPU2.h"
+#include "i2c.h"
+#include "scheduler.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+
+//  ===============================================================================
+//	I2C addresses - see i2c.h
+///
+///		#define DEVICE_PRESSURE        			0xEE (0x77)	Write 0xEE	Read 0xEF
+///		#define DEVICE_COMPASS_HMC5883L			0x3C (0x1E) Write 0x3C	Read 0x3D
+///		#define DEVICE_ACCELARATOR_MMA8452Q 0x38 (0x1C) Write 0x38	Read 0x39
+///		#define DEVICE_BATTERYGAUGE 				0xC8 (0x64)	Write 0xC8
+
+///		#define DEVICE_COMPASS_303D					0x3C // 0x1E // x0011110 // SA0 to GND
+///		
+/// 0x6E 0x48 -> 0x6F 3d d1 86 3f    0x66 58
+///
+//  ===============================================================================
+I2C_HandleTypeDef I2cHandle;
+
+
+/*
+static void I2C_Error_Handler(void)
+{
+  while(1)
+  {
+  }
+}
+*/
+
+HAL_StatusTypeDef I2C1_Status(void)
+{
+return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+}
+
+
+GPIO_PinState HAL_I2C_Read_Data_PIN(void)
+{
+	return HAL_GPIO_ReadPin(I2Cx_SDA_GPIO_PORT,I2Cx_SDA_PIN);
+}
+
+void HAL_I2C_Send_One_CLOCK(void)
+{
+	HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_RESET);
+	HAL_Delay(10);
+	HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_SET);
+	HAL_Delay(10);
+}
+
+GPIO_PinState MX_I2C1_TestAndClear(void)
+{
+	I2C_DeInit();
+	HAL_I2C_ManualControl_MspInit();
+	for(int i=0; i<9;i++)
+	{
+		if(HAL_I2C_Read_Data_PIN() == GPIO_PIN_RESET)
+			HAL_I2C_Send_One_CLOCK();
+		else
+			break;
+	}
+	return HAL_I2C_Read_Data_PIN();
+}
+
+HAL_StatusTypeDef MX_I2C1_Init(void)
+{
+	I2cHandle.Instance             = I2Cx;
+  I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
+  I2cHandle.Init.ClockSpeed      = 100000;//400000;
+  I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
+  I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_16_9;
+  I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
+  I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLED;
+  I2cHandle.Init.OwnAddress1     = 0x01;
+  
+	global.dataSendToSlaveStopEval = 1;
+
+	global.I2C_SystemStatus = HAL_I2C_Init(&I2cHandle);
+
+	global.dataSendToSlaveStopEval = 0;
+	if(global.dataSendToSlavePending)
+	{
+		scheduleSpecial_Evaluate_DataSendToSlave();
+	}
+	return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+}
+
+
+void I2C_DeInit(void)
+{
+	HAL_I2C_DeInit(&I2cHandle);
+}
+
+
+uint8_t i2c_errors = 0;
+
+void I2C_Error_count(void)
+{
+	i2c_errors++;
+}
+
+
+HAL_StatusTypeDef I2C_Master_TransmitNoStop(  uint16_t DevAddress, uint8_t *pData, uint16_t Size)
+{
+	if(global.I2C_SystemStatus != HAL_OK)
+		return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+	
+	global.dataSendToSlaveStopEval = 1;
+	
+  global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress,  pData, Size, 100 /*FIXME , 0*/);
+	if(global.I2C_SystemStatus != HAL_OK)
+	{
+		I2C_Error_count();
+	}
+	global.dataSendToSlaveStopEval = 0;
+	if(global.dataSendToSlavePending)
+	{
+		scheduleSpecial_Evaluate_DataSendToSlave();
+	}
+	return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+}
+
+
+HAL_StatusTypeDef I2C_Master_Transmit(  uint16_t DevAddress, uint8_t *pData, uint16_t Size)
+{
+	if(global.I2C_SystemStatus != HAL_OK)
+		return (HAL_StatusTypeDef)(global.I2C_SystemStatus & 0x03);
+
+	
+	global.dataSendToSlaveStopEval = 1;
+
+	global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress,  pData, Size, 100 /*FIXME , 1*/);
+	if(global.I2C_SystemStatus != HAL_OK)
+	{
+		I2C_Error_count();
+	}
+
+	global.dataSendToSlaveStopEval = 0;
+	if(global.dataSendToSlavePending)
+	{
+		scheduleSpecial_Evaluate_DataSendToSlave();
+	}
+	
+	return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+}
+
+
+HAL_StatusTypeDef I2C_Master_Receive(  uint16_t DevAddress, uint8_t *pData, uint16_t Size)
+{
+	if(global.I2C_SystemStatus != HAL_OK)
+		return (HAL_StatusTypeDef)global.I2C_SystemStatus;
+
+	uint8_t localHALstatusReturn = 0xFF;
+
+	global.dataSendToSlaveStopEval = 1;
+
+  localHALstatusReturn = HAL_I2C_Master_Receive(&I2cHandle, DevAddress,  pData, Size, 100);
+	if(localHALstatusReturn != HAL_OK)
+	{
+		I2C_Error_count();
+	}
+
+	global.dataSendToSlaveStopEval = 0;
+	if(global.dataSendToSlavePending)
+	{
+		scheduleSpecial_Evaluate_DataSendToSlave();
+	}
+	return (HAL_StatusTypeDef)localHALstatusReturn;
+}
+