Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
718cfc4612 | ||
|
|
5a581b7a9f | ||
|
|
bbb758fd4c | ||
|
|
d4fbe99b8b | ||
|
|
c98e4126b2 | ||
|
|
c6559312f0 | ||
|
|
f4d5b8b000 | ||
|
|
65659b7b99 | ||
|
|
52e92feae7 | ||
|
|
98ca6784a0 | ||
|
|
f700422878 | ||
|
|
5aa27348b5 | ||
|
|
c7e2713004 | ||
|
|
4db03d5832 | ||
|
|
f355ff6c01 | ||
|
|
96bda69a0a | ||
|
|
252c98372d | ||
|
|
1ec2477033 | ||
|
|
6b21844020 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -27,7 +27,7 @@
|
|||||||
*.app
|
*.app
|
||||||
*.i*86
|
*.i*86
|
||||||
*.x86_64
|
*.x86_64
|
||||||
workspace/*.hex
|
*.hex
|
||||||
|
|
||||||
# Debug files
|
# Debug files
|
||||||
*.dSYM/
|
*.dSYM/
|
||||||
@@ -36,4 +36,3 @@ workspace/ts100/Debug/*
|
|||||||
workspace/.metadata/*
|
workspace/.metadata/*
|
||||||
|
|
||||||
workspace/ts100/.settings/language.settings.xml
|
workspace/ts100/.settings/language.settings.xml
|
||||||
workspace/ts100/.cproject
|
|
||||||
|
|||||||
2113
Flash Backup.hex
2113
Flash Backup.hex
File diff suppressed because it is too large
Load Diff
25
README.md
25
README.md
@@ -1,32 +1,21 @@
|
|||||||
# TS100
|
# TS100
|
||||||
This is a complete open source re-write of the software for the ts100 soldering iron.
|
This is a complete open source re-write of the software for the ts100 soldering iron sold by minidso
|
||||||
|
|
||||||
This was started to remove the need for USB for changing system settings.
|
This was started to remove the need for usb for changing system settings.
|
||||||
|
|
||||||
The software has similar functionality to the original firmware.
|
The software has similar functionality to the original firmware.
|
||||||
|
|
||||||
## Features Working
|
# Features Working
|
||||||
* Soldering / Temperature control
|
* Soldering / Temperature control
|
||||||
* Full PID Iron Temp
|
* Full PID Iron Temp
|
||||||
* Adjusting temperature
|
* Adjusting temperature
|
||||||
* Automatic sleep
|
* Automatic sleep
|
||||||
* Motion wake support
|
* Motion wake support
|
||||||
* Basic settings menu
|
* Basic settings menu
|
||||||
|
|
||||||
|
# Features still to be implimented
|
||||||
* Input voltage UVLO measurement
|
* Input voltage UVLO measurement
|
||||||
* Saving settings to flash for persistence
|
* Saving settings to flash for persistance
|
||||||
* Improved GUI
|
* Improved GUI
|
||||||
* Use hardware I2C for communications
|
|
||||||
* Can disable movement detection if desired
|
|
||||||
## Features still to be implemented
|
|
||||||
* Manual Temp Calibration
|
* Manual Temp Calibration
|
||||||
|
* Use hardware I2C
|
||||||
# Upgrading your ts100 iron
|
|
||||||
This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware :)
|
|
||||||
|
|
||||||
1. Hold the button closest to the tip, and plug in the USB to the computer.
|
|
||||||
2. The unit will appear as a USB drive.
|
|
||||||
3. Drag the .hex file onto the USB drive.
|
|
||||||
4. The unit will disconnect and reconnect.
|
|
||||||
5. The filename will have changed to end in .RDY or .ERR .
|
|
||||||
6. If it ends with .RDY your done! Otherwise something went wrong.
|
|
||||||
7. If it went wrong try on a windows computer, some Mac / Linux machines do not play well with their boot loader.
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}" ;arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}" ">
|
||||||
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657." name="/" resourcePath="">
|
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657." name="/" resourcePath="">
|
||||||
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.2123758208" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
|
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.2123758208" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
|
||||||
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1416828544" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1416828544" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.1926145385" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
|
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.1926145385" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
|
||||||
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.104990963" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
|
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.104990963" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
|
||||||
<option id="gnu.both.asm.option.include.paths.834243276" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
<option id="gnu.both.asm.option.include.paths.834243276" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
|
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/inc"/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/StdPeriph_Driver/inc}""/>
|
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/StdPeriph_Driver/inc"/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/core}""/>
|
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/core"/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/device}""/>
|
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/device"/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754789872" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754789872" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.610009869" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
|
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.610009869" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
|
||||||
|
|||||||
@@ -62,11 +62,11 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
|
|||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||||
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 47K
|
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K
|
||||||
|
|
||||||
}
|
}
|
||||||
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
|
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
|
||||||
/*^ The offset at the beginning in the bootloader, 1K at the end for settings (actually 256 bytes, but leaving room for now)*/
|
/*^ The rom is shortened as the last ~10K is used for storing the virtual USB Disk, and the offset at the beginning in the bootloader*/
|
||||||
/* Sections */
|
/* Sections */
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
|
|||||||
43
workspace/ts100/inc/APP_Version.h
Normal file
43
workspace/ts100/inc/APP_Version.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
||||||
|
File Name : APP_Version.h
|
||||||
|
Version : S100 APP Ver 2.11
|
||||||
|
Description:
|
||||||
|
Author : bure & Celery
|
||||||
|
Data: 2015/08/03
|
||||||
|
History:
|
||||||
|
2015/08/03 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __VERSION_H
|
||||||
|
#define __VERSION_H
|
||||||
|
|
||||||
|
#define M_VER 'V','0'
|
||||||
|
#define S_VER '0','1'
|
||||||
|
#define OEM_TYPE "0"
|
||||||
|
#define APP_BASE 0x0800C000/*Start address of the virtual disk*/
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
#ifdef TYPE_DS201
|
||||||
|
#define PRODUCT_INFO "DS201"
|
||||||
|
#define SCH_VER "1.7B"
|
||||||
|
#else
|
||||||
|
#ifdef TYPE_DS202
|
||||||
|
#include "DS202V1_6.h"
|
||||||
|
#define FLASH_PAGE 0x0800
|
||||||
|
#else
|
||||||
|
#ifdef TYPE_DS203
|
||||||
|
#define PRODUCT_INFO "DS203"
|
||||||
|
#define SCH_VER "2.70"
|
||||||
|
#else
|
||||||
|
#ifdef TYPE_S100
|
||||||
|
#define PRODUCT_INFO "TS100"
|
||||||
|
#include "S100V0_1.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
#define DFU_VER {M_VER,'.',S_VER,LCD_M, 0}
|
||||||
|
#endif /* VERSION_H */
|
||||||
|
/********************************* END OF FILE ******************************/
|
||||||
@@ -3,18 +3,16 @@
|
|||||||
*
|
*
|
||||||
* Created on: 20 Sep 2016
|
* Created on: 20 Sep 2016
|
||||||
* Author: ralim
|
* Author: ralim
|
||||||
*
|
|
||||||
* Interface to the ADC's basically
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ANALOG_H_
|
#ifndef ANALOG_H_
|
||||||
#define ANALOG_H_
|
#define ANALOG_H_
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
|
#include "S100V0_1.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
extern volatile uint16_t ADC1ConvertedValue[2];
|
extern volatile uint16_t ADC1ConvertedValue[2];
|
||||||
|
|
||||||
uint16_t Get_ADC1Value(uint8_t i);
|
uint16_t Get_ADC1Value(uint8_t i);
|
||||||
uint16_t readIronTemp(uint16_t calibration,uint8_t read);//read the iron temp in C X10
|
uint16_t readIronTemp(uint16_t calibration,uint8_t read);
|
||||||
uint16_t readDCVoltage();/*Get the system voltage X10*/
|
|
||||||
#endif /* ANALOG_H_ */
|
#endif /* ANALOG_H_ */
|
||||||
|
|||||||
@@ -7,14 +7,7 @@
|
|||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "S100V0_1.h"/*For pin definitions*/
|
#include "S100V0_1.h"/*For pin definitions*/
|
||||||
#include "Analog.h"/*So that we can attach the DMA to the output array*/
|
#include "Analog.h"/*So that we can attach the DMA to the output array*/
|
||||||
#include "stm32f10x_flash.h"
|
|
||||||
#include "stm32f10x_rcc.h"
|
|
||||||
#include "stm32f10x_dma.h"
|
|
||||||
#include "stm32f10x_adc.h"
|
|
||||||
#include "stm32f10x_tim.h"
|
|
||||||
#include "stm32f10x_exti.h"
|
|
||||||
#include "stm32f10x_iwdg.h"
|
|
||||||
#include "misc.h"
|
|
||||||
extern volatile uint32_t gHeat_cnt;
|
extern volatile uint32_t gHeat_cnt;
|
||||||
|
|
||||||
inline void setIronTimer(uint32_t time) {
|
inline void setIronTimer(uint32_t time) {
|
||||||
@@ -41,4 +34,4 @@ void Init_EXTI(void);
|
|||||||
void Start_Watchdog(uint32_t ms);
|
void Start_Watchdog(uint32_t ms);
|
||||||
void Clear_Watchdog(void);
|
void Clear_Watchdog(void);
|
||||||
#endif
|
#endif
|
||||||
|
/********************************* END OF FILE ********************************/
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
*
|
*
|
||||||
* Created on: 17 Sep 2016
|
* Created on: 17 Sep 2016
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*
|
|
||||||
* ... This file contains the font...
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FONT_H_
|
#ifndef FONT_H_
|
||||||
@@ -86,10 +84,7 @@ const u8 FONT[]={
|
|||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
|
||||||
|
|
||||||
0x00,0x60,0xF0,0x98,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*<*/
|
|
||||||
0x00,0x02,0x06,0x0C,0x98,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*>*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FONT_H_ */
|
#endif /* FONT_H_ */
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||||
* I2C.h
|
File Name : I2C.h
|
||||||
* I2C wrapper for the stm32 hardware I2C port
|
Version : S100 APP Ver 2.11
|
||||||
*/
|
Description:
|
||||||
|
Author : Celery
|
||||||
|
Data: 2015/08/03
|
||||||
|
History:
|
||||||
|
2015/08/03 :
|
||||||
|
*******************************************************************************/
|
||||||
#ifndef __I2C_H
|
#ifndef __I2C_H
|
||||||
#define __I2C_H
|
#define __I2C_H
|
||||||
|
|
||||||
#include "stm32f10x_i2c.h"
|
#define I2C_TX 1
|
||||||
#include "stm32f10x.h"
|
#define I2C_RX 2
|
||||||
#include "stm32f10x_gpio.h"
|
|
||||||
|
|
||||||
void I2C_Configuration(void);
|
void I2C_Configuration(void);
|
||||||
void I2C_PageWrite(u8* pbuf, u8 numbyte, u8 deviceaddr);
|
void Delay_uS(u32 us);
|
||||||
void I2C_PageRead(u8* pbuf, u8 numbyte, u8 deviceaddr, u8 readaddr);
|
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr );
|
||||||
|
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr);
|
||||||
#endif
|
#endif
|
||||||
/******************************** END OF FILE *********************************/
|
/******************************** END OF FILE *********************************/
|
||||||
|
|||||||
@@ -1,11 +1,34 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. *******************/
|
||||||
* Interrupt Service Routines
|
/* Brief : Interrupt Service Routines Author : bure */
|
||||||
* This file manages all the IRQ events that can be generated
|
/******************************************************************************/
|
||||||
*/
|
|
||||||
#ifndef __INTERRUPT_H
|
#ifndef __INTERRUPT_H
|
||||||
#define __INTERRUPT_H
|
#define __INTERRUPT_H
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
/* Functions for access to data */
|
//See here for refernce to this block http://embedded.kleier.selfhost.me/vector.php
|
||||||
|
/*This loop is used for un assigned IRQ's so that the debugger can catch them*/
|
||||||
|
|
||||||
|
void NMI_Handler(void);
|
||||||
|
void HardFault_Handler(void);
|
||||||
|
void MemManage_Handler(void);
|
||||||
|
void BusFault_Handler(void);
|
||||||
|
void UsageFault_Handler(void);
|
||||||
|
void SVC_Handler(void);
|
||||||
|
void DebugMon_Handler(void);
|
||||||
|
void PendSV_Handler(void);
|
||||||
|
void SysTick_Handler(void);
|
||||||
|
|
||||||
|
void WWDG_IRQHandler(void);
|
||||||
|
void PVD_IRQHandler(void);
|
||||||
|
void TAMPER_STAMP_IRQHandler(void);
|
||||||
|
void RTC_WKUP_IRQHandler(void);
|
||||||
|
void FLASH_IRQHandler(void);
|
||||||
|
|
||||||
|
void USB_LP_CAN1_RX0_IRQHandler(void);
|
||||||
|
void I2C1_EV_IRQHandler(void);
|
||||||
|
void I2C1_ER_IRQHandler(void);
|
||||||
|
void TIM2_IRQHandler(void);
|
||||||
|
void TIM3_IRQHandler(void);
|
||||||
|
|
||||||
extern volatile uint32_t system_Ticks;
|
extern volatile uint32_t system_Ticks;
|
||||||
void delayMs(uint32_t ticks);
|
void delayMs(uint32_t ticks);
|
||||||
volatile extern uint32_t lastKeyPress;
|
volatile extern uint32_t lastKeyPress;
|
||||||
@@ -34,30 +57,6 @@ inline uint32_t getLastMovement() {
|
|||||||
inline uint16_t getButtons() {
|
inline uint16_t getButtons() {
|
||||||
return keyState;
|
return keyState;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*IRQ prototypes*/
|
|
||||||
void NMI_Handler(void);
|
|
||||||
void HardFault_Handler(void);
|
|
||||||
void MemManage_Handler(void);
|
|
||||||
void BusFault_Handler(void);
|
|
||||||
void UsageFault_Handler(void);
|
|
||||||
void SVC_Handler(void);
|
|
||||||
void DebugMon_Handler(void);
|
|
||||||
void PendSV_Handler(void);
|
|
||||||
void SysTick_Handler(void);
|
|
||||||
|
|
||||||
void WWDG_IRQHandler(void);
|
|
||||||
void PVD_IRQHandler(void);
|
|
||||||
void TAMPER_STAMP_IRQHandler(void);
|
|
||||||
void RTC_WKUP_IRQHandler(void);
|
|
||||||
void FLASH_IRQHandler(void);
|
|
||||||
|
|
||||||
void USB_LP_CAN1_RX0_IRQHandler(void);
|
|
||||||
void I2C1_EV_IRQHandler(void);
|
|
||||||
void I2C1_ER_IRQHandler(void);
|
|
||||||
void TIM2_IRQHandler(void);
|
|
||||||
void TIM3_IRQHandler(void);
|
|
||||||
|
|
||||||
void WWDG_IRQHandler(void);
|
void WWDG_IRQHandler(void);
|
||||||
void PVD_IRQHandler(void);
|
void PVD_IRQHandler(void);
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,7 @@
|
|||||||
*
|
*
|
||||||
* http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8652FC.pdf
|
* http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8652FC.pdf
|
||||||
*
|
*
|
||||||
* EXTI Motion config setup values lifted from AN4070 from NXP
|
* EXTI Motion config setup values lifted from AN4070from NXP
|
||||||
* #defines also taken from ^
|
|
||||||
*
|
*
|
||||||
* Ben V. Brown - <ralim@ralimtek.com>
|
* Ben V. Brown - <ralim@ralimtek.com>
|
||||||
*/
|
*/
|
||||||
@@ -15,7 +14,7 @@
|
|||||||
#define __MMA8652FC__H
|
#define __MMA8652FC__H
|
||||||
|
|
||||||
|
|
||||||
void StartUp_Accelerometer(void);//This is the only function we expose
|
void StartUp_Acceleromter(void);//This is the only function we expose
|
||||||
|
|
||||||
//--------------MMA8652 Device ID----------------------------------------------//
|
//--------------MMA8652 Device ID----------------------------------------------//
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,6 @@
|
|||||||
*
|
*
|
||||||
* Created on: 17 Sep 2016
|
* Created on: 17 Sep 2016
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*
|
|
||||||
* Modes.h -> Main function for driving the application
|
|
||||||
* This processes the buttons then does the gui
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MODES_H_
|
#ifndef MODES_H_
|
||||||
@@ -14,23 +11,27 @@
|
|||||||
#include "S100V0_1.h"
|
#include "S100V0_1.h"
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
#include "Settings.h"
|
|
||||||
#include "Analog.h"
|
|
||||||
enum {
|
enum {
|
||||||
STARTUP, //we are sitting on the prompt to push a button
|
STARTUP, //we are sitting on the prompt to push a button
|
||||||
SOLDERING,
|
SOLDERING,
|
||||||
TEMP_ADJ,
|
TEMP_ADJ,
|
||||||
SETTINGS,
|
SETTINGS,
|
||||||
SLEEP,
|
SLEEP,
|
||||||
COOLING,
|
|
||||||
UVLOWARN,
|
|
||||||
} operatingMode;
|
} operatingMode;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,MOTIONDETECT,
|
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,
|
||||||
|
|
||||||
} settingsPage;
|
} settingsPage;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint32_t SolderingTemp; //current setpoint for the iron
|
||||||
|
uint8_t SleepTime; //minutes to sleep
|
||||||
|
uint32_t SleepTemp; //temp to drop to in sleep
|
||||||
|
uint8_t cutoutVoltage; //X10 the voltage we cutout at for undervoltage
|
||||||
|
uint8_t movementEnabled;
|
||||||
|
} systemSettings;
|
||||||
|
|
||||||
void ProcessUI();
|
void ProcessUI();
|
||||||
void DrawUI();
|
void DrawUI();
|
||||||
#endif /* MODES_H_ */
|
#endif /* MODES_H_ */
|
||||||
|
|||||||
@@ -1,27 +1,35 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||||
* Oled.h
|
File Name : Oled.h
|
||||||
* Functions for writing to the OLED screen
|
Version : S100 APP Ver 2.11
|
||||||
* Basically wraps drawing text and numbers to the OLED
|
Description:
|
||||||
* Uses font.h -> 14 pixel wide fixed width
|
Author : Celery
|
||||||
*/
|
Data: 2015/07/07
|
||||||
|
History:
|
||||||
|
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
#ifndef _OLED_SSD1306_H
|
#ifndef _OLED_SSD1306_H
|
||||||
#define _OLED_SSD1306_H
|
#define _OLED_SSD1306_H
|
||||||
|
|
||||||
#define DEVICEADDR_OLED 0x3c
|
#define DEVICEADDR_OLED 0x3c
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
|
void Sc_Pt(u8 Co);
|
||||||
void Oled_DisplayOn(void);
|
void Oled_DisplayOn(void);
|
||||||
void Oled_DisplayOff(void);
|
void Oled_DisplayOff(void);
|
||||||
|
|
||||||
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
||||||
void Set_ShowPos(u8 x, u8 y);
|
void Set_ShowPos(u8 x, u8 y);
|
||||||
|
|
||||||
|
u8* Show_posi(u8 posi, u8* ptr, u8 word_width);
|
||||||
|
void Clean_Char(int k, u8 wide);
|
||||||
|
void Write_Command(u8 Data);
|
||||||
|
void Write_Data(u8 Data);
|
||||||
void GPIO_Init_OLED(void);
|
void GPIO_Init_OLED(void);
|
||||||
void Init_Oled(void);
|
void Init_Oled(void);
|
||||||
u8* Data_Command(u8 len, u8* ptr);
|
u8* Data_Command(u8 len, u8* ptr);
|
||||||
void Clear_Screen(void);//Clear the screen
|
void Reg_Command(u8 posi, u8 flag);
|
||||||
/*Functions for writing to the screen*/
|
void Clear_Screen(void);
|
||||||
|
void Write_InitCommand_data(u32 Com_len, u8* data);
|
||||||
|
void Display_BG(void);
|
||||||
void OLED_DrawString(char* string, uint8_t length);
|
void OLED_DrawString(char* string, uint8_t length);
|
||||||
void OLED_DrawChar(char c, uint8_t x);
|
void OLED_DrawChar(char c, uint8_t x);
|
||||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
||||||
|
|||||||
@@ -3,15 +3,12 @@
|
|||||||
*
|
*
|
||||||
* Created on: 20 Sep 2016
|
* Created on: 20 Sep 2016
|
||||||
* Author: ralim
|
* Author: ralim
|
||||||
*
|
|
||||||
* Functions for computing the PID for the iron temp
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PID_H_
|
#ifndef PID_H_
|
||||||
#define PID_H_
|
#define PID_H_
|
||||||
#include "Analog.h"
|
#include "Analog.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t kp, ki, kd; //PID values
|
uint32_t kp, ki, kd; //PID values
|
||||||
} pidSettings;
|
} pidSettings;
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
||||||
* Defines for the device
|
Brief : <20>ײ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Author : bure
|
||||||
* These houses the settings for the device hardware
|
Modified by Ben V. Brown into English
|
||||||
*/
|
*******************************************************************************/
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "stm32f10x_gpio.h"
|
|
||||||
|
#define PRODUCT_INFO "TS100"
|
||||||
|
#define MCU_TYPE "STM32F103T8"
|
||||||
|
#define SCH_VER "2.46"
|
||||||
|
|
||||||
|
#define SPIx SPI1
|
||||||
//--------------------------- key Definitions ------------------------------//
|
//--------------------------- key Definitions ------------------------------//
|
||||||
#define KEY1_PIN GPIO_Pin_9 //PA8
|
#define KEY1_PIN GPIO_Pin_9 //PA8
|
||||||
#define KEY2_PIN GPIO_Pin_6 //PA6
|
#define KEY2_PIN GPIO_Pin_6 //PA6
|
||||||
@@ -12,24 +17,45 @@
|
|||||||
#define KEY_B KEY2_PIN
|
#define KEY_B KEY2_PIN
|
||||||
#define BUT_A 0x01
|
#define BUT_A 0x01
|
||||||
#define BUT_B 0x02
|
#define BUT_B 0x02
|
||||||
|
#define BUT_AB BUT_A|BUT_B
|
||||||
|
#define KEY_1 !(GPIOA->IDR & KEY1_PIN)
|
||||||
|
#define KEY_2 !(GPIOA->IDR & KEY2_PIN)
|
||||||
|
#define KEY_DFU KEY_1
|
||||||
|
|
||||||
|
#define I2C1_DMA_CHANNEL_TX DMA1_Channel6
|
||||||
|
#define I2C1_DMA_CHANNEL_RX DMA1_Channel7
|
||||||
|
|
||||||
|
#define I2C2_DMA_CHANNEL_TX DMA1_Channel4
|
||||||
|
#define I2C2_DMA_CHANNEL_RX DMA1_Channel5
|
||||||
|
|
||||||
|
#define I2C1_DR_Address 0x40005410
|
||||||
|
#define I2C2_DR_Address 0x40005810
|
||||||
|
|
||||||
//--------------------------- OLED ------------------------------//
|
//--------------------------- OLED ------------------------------//
|
||||||
#define OLED_RST_PIN GPIO_Pin_8 //PA9
|
#define OLED_RST_PIN GPIO_Pin_8 //PA9
|
||||||
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
|
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
|
||||||
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
|
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
|
||||||
|
|
||||||
//------------------------------ Iron Heater --------------------------------//
|
//------------------------------ --------------------------------//
|
||||||
#define HEAT_PIN GPIO_Pin_4
|
#define HEAT_PIN GPIO_Pin_4
|
||||||
|
|
||||||
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
|
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
|
||||||
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
|
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
|
||||||
|
|
||||||
//-----------------------Battery voltage measurement---------------------------------------//
|
//-----------------------VB---------------------------------------//
|
||||||
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
|
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
|
||||||
|
//----------------------------ADX345 INT1,INT2--------------------------------//
|
||||||
//----------------------------Accelerometer INT1,INT2--------------------------------//
|
|
||||||
#define INT1_PIN GPIO_Pin_5 //PB5
|
#define INT1_PIN GPIO_Pin_5 //PB5
|
||||||
#define INT2_PIN GPIO_Pin_3 //PB3
|
#define INT2_PIN GPIO_Pin_3 //PB3
|
||||||
|
//------------------------------ GPIO -------------------------------//
|
||||||
|
|
||||||
|
#define GPIOA_OUTPUT() GPIOA->ODR = 0xFFFF;
|
||||||
|
#define GPIOA_L_DEF() GPIOA->CRL = 0x08888888; /* Ai7 K2 xxx xxx xxx xxx xxx xxx */
|
||||||
|
#define GPIOA_H_DEF() GPIOA->CRH = 0x8BBBB883; /* xxx SWC SWD D+ D- xxx K1 nCR */
|
||||||
|
|
||||||
|
#define GPIOB_OUTPUT() GPIOB->ODR = 0xFFFF;
|
||||||
|
#define GPIOB_L_DEF() GPIOB->CRL = 0x44838800; /* SDA SCL It1 Po It2 xxx Ai9 Ai8 */
|
||||||
|
#define GPIOB_H_DEF() GPIOB->CRH = 0x88888888; /* xxx xxx xxx xxx xxx xxx xxx xxx */
|
||||||
|
|
||||||
//--------------------------------- RCC Clock Config ---------------------------------//
|
//--------------------------------- RCC Clock Config ---------------------------------//
|
||||||
|
|
||||||
@@ -46,3 +72,4 @@
|
|||||||
||+-------Bit22 = 1 USB prescaler is PLL clock
|
||+-------Bit22 = 1 USB prescaler is PLL clock
|
||||||
++--------Bits31~27 Reserved*/
|
++--------Bits31~27 Reserved*/
|
||||||
|
|
||||||
|
/******************************** END OF FILE *********************************/
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Settings.h
|
|
||||||
*
|
|
||||||
* Created on: 29 Sep 2016
|
|
||||||
* Author: Ralim
|
|
||||||
*
|
|
||||||
* Houses the system settings and allows saving / restoring from flash
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SETTINGS_H_
|
|
||||||
#define SETTINGS_H_
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "stm32f10x_flash.h"
|
|
||||||
#define SETTINGSVERSION 0x01 /*Change this if you change the struct below to prevent people getting out of sync*/
|
|
||||||
struct {
|
|
||||||
uint32_t SolderingTemp; //current setpoint for the iron
|
|
||||||
uint32_t SleepTemp; //temp to drop to in sleep
|
|
||||||
uint8_t SleepTime; //minutes to sleep
|
|
||||||
uint8_t cutoutVoltage; //X10 the voltage we cutout at for undervoltage
|
|
||||||
uint8_t movementEnabled;
|
|
||||||
uint8_t version;
|
|
||||||
} systemSettings;
|
|
||||||
//Settings struct used for user settings
|
|
||||||
|
|
||||||
void saveSettings();
|
|
||||||
void restoreSettings();
|
|
||||||
void resetSettings();
|
|
||||||
#endif /* SETTINGS_H_ */
|
|
||||||
85
workspace/ts100/inc/stm32f10x_conf.h
Normal file
85
workspace/ts100/inc/stm32f10x_conf.h
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32f10x_conf.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V4.0.0
|
||||||
|
* @date 21-January-2013
|
||||||
|
* @brief Library configuration file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
||||||
|
*
|
||||||
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.st.com/software_license_agreement_liberty_v2
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __STM32F10x_CONF_H
|
||||||
|
#define __STM32F10x_CONF_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
/* Uncomment the line below to enable peripheral header file inclusion */
|
||||||
|
#include "stm32f10x_adc.h"
|
||||||
|
#include "stm32f10x_bkp.h"
|
||||||
|
#include "stm32f10x_can.h"
|
||||||
|
#include "stm32f10x_crc.h"
|
||||||
|
#include "stm32f10x_dac.h"
|
||||||
|
#include "stm32f10x_dbgmcu.h"
|
||||||
|
#include "stm32f10x_dma.h"
|
||||||
|
#include "stm32f10x_exti.h"
|
||||||
|
#include "stm32f10x_flash.h"
|
||||||
|
#include "stm32f10x_fsmc.h"
|
||||||
|
#include "stm32f10x_gpio.h"
|
||||||
|
#include "stm32f10x_i2c.h"
|
||||||
|
#include "stm32f10x_iwdg.h"
|
||||||
|
#include "stm32f10x_pwr.h"
|
||||||
|
#include "stm32f10x_rcc.h"
|
||||||
|
#include "stm32f10x_rtc.h"
|
||||||
|
#include "stm32f10x_sdio.h"
|
||||||
|
#include "stm32f10x_spi.h"
|
||||||
|
#include "stm32f10x_tim.h"
|
||||||
|
#include "stm32f10x_usart.h"
|
||||||
|
#include "stm32f10x_wwdg.h"
|
||||||
|
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/* Uncomment the line below to expanse the "assert_param" macro in the
|
||||||
|
Standard Peripheral Library drivers code */
|
||||||
|
/* #define USE_FULL_ASSERT 1 */
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Macro Name : assert_param
|
||||||
|
* Description : The assert_param macro is used for function's parameters check.
|
||||||
|
* Input : - expr: If expr is false, it calls assert_failed function
|
||||||
|
* which reports the name of the source file and the source
|
||||||
|
* line number of the call that failed.
|
||||||
|
* If expr is true, it returns no value.
|
||||||
|
* Return : None
|
||||||
|
*******************************************************************************/
|
||||||
|
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
void assert_failed(uint8_t* file, uint32_t line);
|
||||||
|
#else
|
||||||
|
#define assert_param(expr) ((void)0)
|
||||||
|
#endif /* USE_FULL_ASSERT */
|
||||||
|
|
||||||
|
#endif /* __STM32F10x_CONF_H */
|
||||||
|
|
||||||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||||
@@ -8,8 +8,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "Analog.h"
|
#include "Analog.h"
|
||||||
|
|
||||||
//Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V)
|
|
||||||
//Seems unstable below 9.5V input
|
|
||||||
uint16_t readDCVoltage() {
|
uint16_t readDCVoltage() {
|
||||||
uint16_t reading = 0;
|
uint16_t reading = 0;
|
||||||
for (u8 i = 0; i < 10; i++) {
|
for (u8 i = 0; i < 10; i++) {
|
||||||
@@ -104,7 +102,6 @@ uint16_t Get_ADC1Value(uint8_t i) {
|
|||||||
return ADC1ConvertedValue[i];
|
return ADC1ConvertedValue[i];
|
||||||
}
|
}
|
||||||
//This returns the calibrated temperature reading of the iron temp
|
//This returns the calibrated temperature reading of the iron temp
|
||||||
//inputs : calibration value / wether to take a new reading or not
|
|
||||||
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) {
|
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) {
|
||||||
static uint16_t calTemp = 0;
|
static uint16_t calTemp = 0;
|
||||||
static uint16_t lastVal = 0;
|
static uint16_t lastVal = 0;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Setup all the basic hardware in the system and handle timer3 tick
|
* Setup all the basic hardware in the system and handle timer3 tick
|
||||||
*/
|
*/
|
||||||
|
#include "APP_Version.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
#define ADC1_DR_Address ((u32)0x4001244C)
|
#define ADC1_DR_Address ((u32)0x4001244C)
|
||||||
volatile uint32_t gHeat_cnt = 0;
|
volatile uint32_t gHeat_cnt = 0;
|
||||||
|
|
||||||
@@ -58,6 +58,20 @@ void GPIO_Config(void) {
|
|||||||
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
|
||||||
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
|
||||||
|
|
||||||
|
GPIOA_OUTPUT()
|
||||||
|
;
|
||||||
|
GPIOA_L_DEF()
|
||||||
|
;
|
||||||
|
GPIOA_H_DEF()
|
||||||
|
;
|
||||||
|
|
||||||
|
GPIOB_OUTPUT()
|
||||||
|
;
|
||||||
|
GPIOB_L_DEF()
|
||||||
|
;
|
||||||
|
GPIOB_H_DEF()
|
||||||
|
;
|
||||||
|
|
||||||
//------ PA7 TMP36 Analog input ----------------------------------------//
|
//------ PA7 TMP36 Analog input ----------------------------------------//
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
||||||
|
|||||||
@@ -1,16 +1,66 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||||
* I2C.h hardware interface class
|
File Name : I2C.c
|
||||||
* Based on the STM32 app note AN2824
|
Version : S100 APP Ver 2.11
|
||||||
*/
|
Description:
|
||||||
#include "I2C.h"
|
Author : Celery
|
||||||
|
Data: 2015/07/20
|
||||||
|
History:
|
||||||
|
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
2015/07/21 I2C_DELAYTIME = 2;
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
/*
|
#include "stm32f10x.h"
|
||||||
* Configure the I2C port hardware
|
#include "I2C.h"
|
||||||
*/
|
#include "Bios.h"
|
||||||
void I2C_Configuration(void) {
|
#include "Oled.h"
|
||||||
|
#include "S100V0_1.h"
|
||||||
|
|
||||||
|
// --------- <20><><EFBFBD><EFBFBD>I2C<32>ӿ<EFBFBD><D3BF><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>-------- //
|
||||||
|
#define SDA GPIO_Pin_7
|
||||||
|
#define SCL GPIO_Pin_6
|
||||||
|
|
||||||
|
#define HIGH 1
|
||||||
|
#define LOW 0
|
||||||
|
|
||||||
|
#define SDA_VAL GPIO_ReadInputDataBit(GPIOB, SDA)
|
||||||
|
#define SCL_VAL GPIO_ReadInputDataBit(GPIOB, SCL)
|
||||||
|
|
||||||
|
#define I2C_MORE 1
|
||||||
|
#define I2C_LAST 0
|
||||||
|
#define I2C_TIMEOUT 255
|
||||||
|
|
||||||
|
#define FAILURE 0
|
||||||
|
#define SUCCEED 1
|
||||||
|
#define I2C_DELAYTIME 2
|
||||||
|
|
||||||
|
static void Sim_I2C_Set(u8 pin, u8 status);
|
||||||
|
static void Sim_I2C_Stop(void);
|
||||||
|
static void Sim_I2C_Start(void);
|
||||||
|
static u8 Sim_I2C_RD_Byte(u8 more);
|
||||||
|
static u8 Sim_I2C_WR_Byte(u8 data);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Delay_uS
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ʱ
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:us
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
void Delay_uS(u32 us)
|
||||||
|
{
|
||||||
|
while(us) us--;
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
void I2C_Configuration(void)
|
||||||
|
{
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
I2C_InitTypeDef I2C_InitStructure;
|
I2C_InitTypeDef I2C_InitStructure;
|
||||||
|
|
||||||
|
GPIO_Init_OLED();
|
||||||
/* PB6,7 SCL and SDA */
|
/* PB6,7 SCL and SDA */
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
@@ -20,129 +70,160 @@ void I2C_Configuration(void) {
|
|||||||
/* I2C1 configuration ------------------------------------------------------*/
|
/* I2C1 configuration ------------------------------------------------------*/
|
||||||
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
||||||
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
||||||
|
I2C_InitStructure.I2C_OwnAddress1 = DEVICEADDR_OLED;
|
||||||
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
||||||
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
||||||
I2C_InitStructure.I2C_ClockSpeed = 100000; //100k
|
I2C_InitStructure.I2C_ClockSpeed = 100000;//100k
|
||||||
I2C_Init(I2C1, &I2C_InitStructure);
|
I2C_Init(I2C1, &I2C_InitStructure);
|
||||||
I2C_Cmd(I2C1, ENABLE);
|
I2C_Cmd(I2C1, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*******************************************************************************
|
||||||
* Writes a page of data over I2C using the I2C1 peripheral in the stm32
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
|
||||||
*
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
|
||||||
*/
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
void I2C_PageWrite(u8* buf, u8 nbyte, u8 deviceaddr) {
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
void Sim_I2C_Set(u8 pin, u8 status)
|
||||||
}
|
{
|
||||||
// Intiate Start Sequence
|
if(status == HIGH) GPIO_SetBits (GPIOB, pin);
|
||||||
I2C_GenerateSTART(I2C1, ENABLE);
|
if(status == LOW) GPIO_ResetBits(GPIOB, pin);
|
||||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
|
||||||
}
|
|
||||||
// Send Address
|
|
||||||
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
|
|
||||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {
|
|
||||||
}
|
|
||||||
// Write first byte EV8_1
|
|
||||||
I2C_SendData(I2C1, *buf++);
|
|
||||||
|
|
||||||
while (--nbyte) {
|
|
||||||
// wait on BTF
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
|
||||||
}
|
|
||||||
I2C_SendData(I2C1, *buf++);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
|
||||||
}
|
|
||||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Start
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ʼ
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
void Sim_I2C_Start(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
/*
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // I2C_PIN_EN();
|
||||||
* Read Page of data using I2C1 peripheral
|
GPIO_InitStructure.GPIO_Pin = SCL | SDA;
|
||||||
*/
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
GPIO_Init (GPIOB, &GPIO_InitStructure);
|
||||||
|
|
||||||
void I2C_PageRead(u8* buf, u8 nbyte, u8 deviceaddr, u8 readaddr) {
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
I2C_GenerateSTART(I2C1, ENABLE);
|
Sim_I2C_Set(SDA, HIGH); // SDA float, set as output high
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_SB) == RESET)
|
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||||
;
|
Delay_uS(I2C_DELAYTIME);
|
||||||
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
|
Sim_I2C_Set(SDA, LOW); // SDA high->low while sclk high, S state occur...
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET)
|
Delay_uS(I2C_DELAYTIME);
|
||||||
;
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
I2C_GetFlagStatus(I2C1, I2C_FLAG_MSL);
|
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) == RESET)
|
|
||||||
;
|
|
||||||
// Send an 8bit byte address
|
|
||||||
I2C_SendData(I2C1, readaddr);
|
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
|
||||||
}
|
|
||||||
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
|
||||||
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Current);
|
|
||||||
I2C_GenerateSTART(I2C1, ENABLE);
|
|
||||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
|
||||||
}
|
|
||||||
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Receiver);
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)) {
|
|
||||||
}
|
|
||||||
if (nbyte == 1) {
|
|
||||||
// Clear Ack bit
|
|
||||||
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
|
||||||
// EV6_1 -- must be atomic -- Clear ADDR, generate STOP
|
|
||||||
__disable_irq();
|
|
||||||
(void) I2C1->SR2;
|
|
||||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
|
||||||
__enable_irq();
|
|
||||||
// Receive data EV7
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE)) {
|
|
||||||
}
|
|
||||||
*buf++ = I2C_ReceiveData(I2C1);
|
|
||||||
} else if (nbyte == 2) {
|
|
||||||
// Set POS flag
|
|
||||||
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Next);
|
|
||||||
// EV6_1 -- must be atomic and in this order
|
|
||||||
__disable_irq();
|
|
||||||
(void) I2C1->SR2; // Clear ADDR flag
|
|
||||||
I2C_AcknowledgeConfig(I2C1, DISABLE); // Clear Ack bit
|
|
||||||
__enable_irq();
|
|
||||||
// EV7_3 -- Wait for BTF, program stop, read data twice
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
|
||||||
}
|
|
||||||
__disable_irq();
|
|
||||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
|
||||||
*buf++ = I2C1->DR;
|
|
||||||
__enable_irq();
|
|
||||||
*buf++ = I2C1->DR;
|
|
||||||
} else {
|
|
||||||
(void) I2C1->SR2; // Clear ADDR flag
|
|
||||||
while (nbyte-- != 3) {
|
|
||||||
// EV7 -- cannot guarantee 1 transfer completion time, wait for BTF
|
|
||||||
// instead of RXNE
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
|
||||||
}
|
|
||||||
*buf++ = I2C_ReceiveData(I2C1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
|
||||||
}
|
|
||||||
// EV7_2 -- Figure 1 has an error, doesn't read N-2 !
|
|
||||||
I2C_AcknowledgeConfig(I2C1, DISABLE); // clear ack bit
|
|
||||||
__disable_irq();
|
|
||||||
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-2
|
|
||||||
I2C_GenerateSTOP(I2C1, ENABLE); // program stop
|
|
||||||
__enable_irq();
|
|
||||||
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-1
|
|
||||||
// wait for byte N
|
|
||||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
|
|
||||||
}
|
|
||||||
*buf++ = I2C_ReceiveData(I2C1);
|
|
||||||
nbyte = 0;
|
|
||||||
}
|
|
||||||
// Wait for stop
|
|
||||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Stop
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ֹͣ
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
void Sim_I2C_Stop(void)
|
||||||
|
{
|
||||||
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
|
Sim_I2C_Set(SDA, LOW); // SDA low
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SDA, HIGH); // SDA low->high while sclk high, P state occur
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_WR_Byte
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2Cд<43><D0B4>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:dataҪд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
u8 Sim_I2C_WR_Byte(u8 data)
|
||||||
|
{
|
||||||
|
u8 i = 8;
|
||||||
|
|
||||||
|
while(i--) { //send out a bit by sda line.
|
||||||
|
Sim_I2C_Set(SCL, LOW); // sclk low
|
||||||
|
if(data & 0x80) Sim_I2C_Set(SDA, HIGH); // send bit is 1
|
||||||
|
else Sim_I2C_Set(SDA, LOW); // send bit is 0
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
data <<=1; // left shift 1 bit, MSB send first.
|
||||||
|
}
|
||||||
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
|
Sim_I2C_Set(SDA, HIGH); // SDA set as input
|
||||||
|
for(i=I2C_TIMEOUT; i!=0; i--) { // wait for sda low to receive ack
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
if (!SDA_VAL) {
|
||||||
|
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, LOW); // SCL_LOW();
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
return SUCCEED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_RD_Byte
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:more
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
|
u8 Sim_I2C_RD_Byte(u8 more)
|
||||||
|
{
|
||||||
|
u8 i = 8, byte = 0;
|
||||||
|
|
||||||
|
Sim_I2C_Set(SDA, HIGH); // SDA set as input
|
||||||
|
while(i--) {
|
||||||
|
Sim_I2C_Set(SCL, LOW); // SCL low
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
byte <<=1; //recv a bit
|
||||||
|
if (SDA_VAL) byte |= 0x01;
|
||||||
|
}
|
||||||
|
Sim_I2C_Set(SCL, LOW);
|
||||||
|
if(!more) Sim_I2C_Set(SDA, HIGH); //last byte, send nack.
|
||||||
|
else Sim_I2C_Set(SDA, LOW); //send ack
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, HIGH); // SCL_HIGH();
|
||||||
|
Delay_uS(I2C_DELAYTIME);
|
||||||
|
Sim_I2C_Set(SCL, LOW);
|
||||||
|
return byte;
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageWrite
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><> <20><>ַ deviceaddr д<><D0B4>numbyte<74><65><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pbuf
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:pbuf д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>numbyte Ϊд<CEAA><D0B4><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>deviceaddrΪд<CEAA><D0B4>ĵ<EFBFBD>ַ
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
||||||
|
*******************************************************************************/
|
||||||
|
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr )
|
||||||
|
{
|
||||||
|
Sim_I2C_Start();
|
||||||
|
Sim_I2C_WR_Byte(deviceaddr<<1);
|
||||||
|
while(numbyte--) Sim_I2C_WR_Byte(*pbuf++);
|
||||||
|
Sim_I2C_Stop();
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageRead
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: pbuf <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ŵ<EFBFBD>ַ numbyteΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
||||||
|
deviceaddr<64>豸<EFBFBD><E8B1B8>ַ readaddr<64><72>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||||
|
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
|
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr)
|
||||||
|
{
|
||||||
|
Sim_I2C_Start();
|
||||||
|
Sim_I2C_WR_Byte(deviceaddr<<1);
|
||||||
|
Sim_I2C_WR_Byte(readaddr);
|
||||||
|
Sim_I2C_Start();
|
||||||
|
Sim_I2C_WR_Byte((deviceaddr<<1)|1);
|
||||||
|
|
||||||
|
while(numbyte--) {
|
||||||
|
if(numbyte) *pbuf++ = Sim_I2C_RD_Byte(I2C_MORE);
|
||||||
|
else *pbuf++ = Sim_I2C_RD_Byte(I2C_LAST);
|
||||||
|
}
|
||||||
|
Sim_I2C_Stop();
|
||||||
|
}
|
||||||
|
/******************************** END OF FILE *********************************/
|
||||||
|
|||||||
@@ -205,4 +205,5 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/********************************* END OF FILE ******************************/
|
||||||
|
|
||||||
|
|||||||
@@ -20,24 +20,28 @@ void I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
|||||||
tx_data[0] = reg;
|
tx_data[0] = reg;
|
||||||
tx_data[1] = data;
|
tx_data[1] = data;
|
||||||
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
|
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t I2C_RegisterRead(uint8_t reg) {
|
uint8_t I2C_RegisterRead(uint8_t reg) {
|
||||||
u8 tx_data[3];
|
u8 tx_data[3];
|
||||||
tx_data[0] = reg;
|
tx_data[0] = reg;
|
||||||
|
|
||||||
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
||||||
return tx_data[0];
|
return tx_data[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartUp_Accelerometer(void) {
|
void StartUp_Acceleromter(void) {
|
||||||
|
|
||||||
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
||||||
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
|
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
|
||||||
delayMs(2); // ~1ms delay
|
delayMs(2); // ~1ms delay
|
||||||
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled
|
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78);// Enable motion detection for X and Y axis, latch enabled
|
||||||
I2C_RegisterWrite(FF_MT_THS_REG, 0x0F); // Set threshold
|
I2C_RegisterWrite(FF_MT_THS_REG, 0x0F); // Set threshold
|
||||||
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
|
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
|
||||||
|
|
||||||
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
|
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
|
||||||
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI
|
I2C_RegisterWrite( CTRL_REG5, 0x04); // Route motion interrupts to INT1 ->PB5 ->EXTI
|
||||||
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,48 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||||
* Created by Ben V. Brown
|
File Name : main.c
|
||||||
*/
|
Version : S100 APP Ver 2.11
|
||||||
|
Description:
|
||||||
|
Author : Celery
|
||||||
|
Data: 2015/07/07
|
||||||
|
History:
|
||||||
|
2016/8/11 Updates by Ben V. Brown <ralim@ralimtek.com> - Cleanup and english comments
|
||||||
|
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "APP_Version.h"
|
||||||
#include "Modes.h"
|
#include "Modes.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
|
#include "I2C.h"
|
||||||
#include "MMA8652FC.h"
|
#include "MMA8652FC.h"
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "Settings.h"
|
#include "Interrupt.h"
|
||||||
#include "I2C.h"
|
|
||||||
void setup();
|
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
setup();
|
RCC_Config(); //setup system clock
|
||||||
|
//NVIC_Config(0x4000);//this shifts the NVIC table to be offset
|
||||||
|
NVIC_Config(0x0000);
|
||||||
|
GPIO_Config(); //setup all the GPIO pins
|
||||||
|
Init_EXTI();
|
||||||
|
//Init_Timer2(); //init the timers
|
||||||
|
|
||||||
|
Init_Timer3();
|
||||||
|
I2C_Configuration(); //init the i2c bus
|
||||||
|
|
||||||
|
Adc_Init(); //init adc and dma
|
||||||
|
StartUp_Acceleromter(); //start the accelerometer
|
||||||
|
|
||||||
|
Init_Oled(); //init the OLED display
|
||||||
|
Clear_Screen(); //clear the display buffer to black
|
||||||
|
systemSettings.SleepTemp = 900;
|
||||||
|
systemSettings.SleepTime = 1;
|
||||||
|
systemSettings.SolderingTemp = 1000;
|
||||||
|
systemSettings.movementEnabled = 1; //we use movement detection
|
||||||
|
readIronTemp(239, 0); //load the default calibration value
|
||||||
|
setupPID(); //init the PID values
|
||||||
|
|
||||||
|
Start_Watchdog(3000); //start the system watchdog as 3 seconds
|
||||||
while (1) {
|
while (1) {
|
||||||
Clear_Watchdog(); //reset the Watchdog
|
Clear_Watchdog(); //reset the Watchdog
|
||||||
ProcessUI();
|
ProcessUI();
|
||||||
@@ -20,22 +50,4 @@ int main(void) {
|
|||||||
delayMs(50);
|
delayMs(50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setup()
|
/******************************** END OF FILE *********************************/
|
||||||
{
|
|
||||||
RCC_Config(); //setup system clock
|
|
||||||
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
|
||||||
GPIO_Config(); //setup all the GPIO pins
|
|
||||||
Init_EXTI(); //init the EXTI inputs
|
|
||||||
Init_Timer3(); //Used for the soldering iron tip
|
|
||||||
Adc_Init(); //init adc and dma
|
|
||||||
I2C_Configuration(); //Start the I2C hardware
|
|
||||||
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
|
||||||
StartUp_Accelerometer(); //start the accelerometer
|
|
||||||
Init_Oled(); //init the OLED display
|
|
||||||
Clear_Screen(); //clear the display buffer to black
|
|
||||||
setupPID(); //init the PID values
|
|
||||||
readIronTemp(239, 0); //load the default calibration value
|
|
||||||
restoreSettings(); //Load settings
|
|
||||||
|
|
||||||
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,22 +8,24 @@
|
|||||||
//This does the required processing and state changes
|
//This does the required processing and state changes
|
||||||
void ProcessUI() {
|
void ProcessUI() {
|
||||||
uint8_t Buttons = getButtons(); //read the buttons status
|
uint8_t Buttons = getButtons(); //read the buttons status
|
||||||
static uint32_t lastModeChange = 0;
|
|
||||||
if (millis() - getLastButtonPress() < 200)
|
if (millis() - getLastButtonPress() < 200)
|
||||||
Buttons = 0;
|
Buttons = 0;
|
||||||
//rough prevention for de-bouncing and allocates settling time
|
//rough prevention for debouncing and allocates settling time
|
||||||
|
//OLED_DrawThreeNumber(Buttons, 0);
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
if ((millis() - getLastButtonPress() > 1000)) {
|
if ((millis() - getLastButtonPress() > 1000)) {
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons & BUT_A) {
|
||||||
//A key pressed so we are moving to soldering mode
|
//A key pressed so we are moving to soldering mode
|
||||||
operatingMode = SOLDERING;
|
operatingMode = SOLDERING;
|
||||||
|
delayMs(500);
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons & BUT_B) {
|
||||||
//B Button was pressed so we are moving to the Settings menu
|
//B Button was pressed so we are moving to the Settings menu
|
||||||
operatingMode = SETTINGS;
|
operatingMode = SETTINGS;
|
||||||
|
delayMs(500);
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
}
|
}
|
||||||
@@ -39,7 +41,7 @@ void ProcessUI() {
|
|||||||
resetButtons();
|
resetButtons();
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons & BUT_B) {
|
||||||
//B Button was pressed so we are moving back to idle
|
//B Button was pressed so we are moving back to idle
|
||||||
operatingMode = COOLING;
|
operatingMode = STARTUP;
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
} else {
|
} else {
|
||||||
@@ -53,18 +55,12 @@ void ProcessUI() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint16_t voltage = readDCVoltage(); //get X10 voltage
|
|
||||||
if ((voltage / 10) < systemSettings.cutoutVoltage) {
|
|
||||||
operatingMode = UVLOWARN;
|
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
lastModeChange = millis();
|
|
||||||
}
|
|
||||||
//If no buttons pushed we need to perform the PID loop for the iron temp
|
//If no buttons pushed we need to perform the PID loop for the iron temp
|
||||||
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
||||||
|
if (newOutput >= 0) {
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
@@ -94,11 +90,11 @@ void ProcessUI() {
|
|||||||
if (Buttons & BUT_A) {
|
if (Buttons & BUT_A) {
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
//A key iterates through the menu
|
//A key iterates through the menu
|
||||||
if (settingsPage == 3) {
|
if (settingsPage == 2) {
|
||||||
//Roll off the end
|
//Roll off the end
|
||||||
settingsPage = 0; //reset
|
settingsPage = 0; //reset
|
||||||
operatingMode = STARTUP;
|
operatingMode = STARTUP;
|
||||||
saveSettings(); //Save the settings
|
//TODO Save settings
|
||||||
} else
|
} else
|
||||||
++settingsPage; //move to the next option
|
++settingsPage; //move to the next option
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons & BUT_B) {
|
||||||
@@ -124,10 +120,6 @@ void ProcessUI() {
|
|||||||
systemSettings.SleepTime = 2; //cant set time over an hour
|
systemSettings.SleepTime = 2; //cant set time over an hour
|
||||||
//Remember that ^ is the time of no movement
|
//Remember that ^ is the time of no movement
|
||||||
break;
|
break;
|
||||||
case MOTIONDETECT:
|
|
||||||
systemSettings.movementEnabled =
|
|
||||||
!systemSettings.movementEnabled;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -154,36 +146,8 @@ void ProcessUI() {
|
|||||||
}
|
}
|
||||||
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
||||||
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
||||||
|
if (newOutput >= 0) {
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
|
|
||||||
break;
|
|
||||||
case COOLING: {
|
|
||||||
setIronTimer(0); //turn off heating
|
|
||||||
//This mode warns the user the iron is still cooling down
|
|
||||||
uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings
|
|
||||||
if (temp < 500) { //if the temp is < 50C then we can go back to IDLE
|
|
||||||
operatingMode = STARTUP;
|
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
} else { //we check if the user has pushed a button to ack
|
|
||||||
if ((millis() - getLastButtonPress() > 200)
|
|
||||||
&& (millis() - getLastButtonPress() < 2000)) {
|
|
||||||
if (getButtons() && (BUT_A | BUT_B)) {
|
|
||||||
//A button was pushed
|
|
||||||
operatingMode = STARTUP;
|
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UVLOWARN:
|
|
||||||
//We are here if the DC voltage went too low
|
|
||||||
//We want to jump back to IDLE after a bit
|
|
||||||
if (millis() - lastModeChange > 3000) { //its been 3 seconds
|
|
||||||
operatingMode = STARTUP; //jump back to idle mode
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -192,7 +156,6 @@ void ProcessUI() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DrawUI() {
|
void DrawUI() {
|
||||||
uint16_t temp = readIronTemp(0, 0) / 10;
|
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
//We are chilling in the idle mode
|
//We are chilling in the idle mode
|
||||||
@@ -209,7 +172,8 @@ void DrawUI() {
|
|||||||
case SOLDERING:
|
case SOLDERING:
|
||||||
//The user is soldering
|
//The user is soldering
|
||||||
{
|
{
|
||||||
if (getIronTimer() == 0) {
|
uint16_t temp = readIronTemp(0, 0);
|
||||||
|
if (systemSettings.SolderingTemp + 2 < temp) {
|
||||||
OLED_DrawChar('C', 14 * 4);
|
OLED_DrawChar('C', 14 * 4);
|
||||||
} else {
|
} else {
|
||||||
if (getIronTimer() < 500) {
|
if (getIronTimer() < 500) {
|
||||||
@@ -217,20 +181,23 @@ void DrawUI() {
|
|||||||
} else { //we are heating
|
} else { //we are heating
|
||||||
OLED_DrawChar('H', 14 * 4);
|
OLED_DrawChar('H', 14 * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
OLED_DrawThreeNumber(temp, 0);
|
OLED_DrawThreeNumber(temp / 10, 0);
|
||||||
OLED_DrawChar(' ', 14 * 3);
|
OLED_DrawChar(' ', 14 * 3);
|
||||||
OLED_DrawChar(' ', 14 * 5);
|
OLED_DrawChar(' ', 14 * 5);
|
||||||
OLED_DrawChar(' ', 14 * 6);
|
OLED_DrawChar(' ', 14 * 6);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
//We are prompting the user to change the temp so we draw the current setpoint temp
|
//We are prompting the user to change the temp so we draw the current setpoint temp
|
||||||
//With the nifty arrows
|
//With the nifty arrows
|
||||||
OLED_DrawChar('<', 0);
|
OLED_DrawChar(' ', 0);
|
||||||
OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
|
OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
|
||||||
OLED_DrawChar(' ', 14 * 4);
|
OLED_DrawChar(' ', 14 * 4);
|
||||||
OLED_DrawChar('>', 14 * 5);
|
OLED_DrawChar(' ', 14 * 5);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SETTINGS:
|
case SETTINGS:
|
||||||
//We are prompting the user the setting name
|
//We are prompting the user the setting name
|
||||||
@@ -252,12 +219,6 @@ void DrawUI() {
|
|||||||
OLED_DrawString("STME ", 5);
|
OLED_DrawString("STME ", 5);
|
||||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
|
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
|
||||||
break;
|
break;
|
||||||
case MOTIONDETECT:/*Toggle the mode*/
|
|
||||||
if (systemSettings.movementEnabled)
|
|
||||||
OLED_DrawString("MOTN T", 7);
|
|
||||||
else
|
|
||||||
OLED_DrawString("MOTN F", 7);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -266,15 +227,9 @@ void DrawUI() {
|
|||||||
//The iron is in sleep temp mode
|
//The iron is in sleep temp mode
|
||||||
//Draw in temp and sleep
|
//Draw in temp and sleep
|
||||||
OLED_DrawString("SLP", 3);
|
OLED_DrawString("SLP", 3);
|
||||||
OLED_DrawThreeNumber(temp, 14 * 3);
|
uint16_t temp = readIronTemp(0, 0);
|
||||||
break;
|
OLED_DrawThreeNumber(temp / 10, 14 * 3);
|
||||||
case COOLING:
|
|
||||||
//We are warning the user the tip is cooling
|
|
||||||
OLED_DrawString("COL", 3);
|
|
||||||
OLED_DrawThreeNumber(temp, 14 * 3);
|
|
||||||
break;
|
|
||||||
case UVLOWARN:
|
|
||||||
OLED_DrawString("UND VL", 6);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,25 +1,36 @@
|
|||||||
/*
|
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||||
*
|
File Name : Oled.c
|
||||||
* OLED.c
|
Version : S100 APP Ver 2.11
|
||||||
* Functions for working with the oled screen.
|
Description:
|
||||||
* Writes to the screen using I2C
|
Author : Celery
|
||||||
*/
|
Data: 2015/07/07
|
||||||
|
History:
|
||||||
|
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "APP_Version.h"
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
|
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
/*Setup params for the OLED screen*/
|
|
||||||
u8 OLED_Setup_Array[46] = { 0x80, 0xAE, 0x80, 0xD5, 0x80, 0x52, 0x80, 0xA8,
|
|
||||||
0x80, 0x0f, 0x80, 0xC0, 0x80, 0xD3, 0x80, 0x00, 0x80, 0x40, 0x80, 0xA0,
|
|
||||||
0x80, 0x8D, 0x80, 0x14, 0x80, 0xDA, 0x80, 0x02, 0x80, 0x81, 0x80, 0x33,
|
|
||||||
0x80, 0xD9, 0x80, 0xF1, 0x80, 0xDB, 0x80, 0x30, 0x80, 0xA4, 0x80, 0XA6,
|
|
||||||
0x80, 0xAF };
|
|
||||||
|
|
||||||
|
u8 gOled_param[46] = { 0x80, 0xAE, 0x80, 0xD5, 0x80, 0x52, 0x80, 0xA8, 0x80,
|
||||||
|
0x0f, 0x80, 0xC0, 0x80, 0xD3, 0x80, 0x00, 0x80, 0x40, 0x80, 0xA0, 0x80,
|
||||||
|
0x8D, 0x80, 0x14, 0x80, 0xDA, 0x80, 0x02, 0x80, 0x81, 0x80, 0x33, 0x80,
|
||||||
|
0xD9, 0x80, 0xF1, 0x80, 0xDB, 0x80, 0x30, 0x80, 0xA4, 0x80, 0XA6, 0x80,
|
||||||
|
0xAF };
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
*******************************************************************************/
|
||||||
|
void Sc_Pt(u8 Co) {
|
||||||
|
u8 pt[4] = { 0x80, 0x81, 0x80, Co };
|
||||||
|
|
||||||
|
I2C_PageWrite(pt, 4, DEVICEADDR_OLED);
|
||||||
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function: Oled_DisplayOn
|
Function: Oled_DisplayOn
|
||||||
Description:Turn on the Oled display
|
Description:Turn on the Oled display
|
||||||
@@ -45,16 +56,16 @@ void Oled_DisplayOff(void) {
|
|||||||
Input: number of bytes to write, array to write
|
Input: number of bytes to write, array to write
|
||||||
Output:
|
Output:
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
u8* Data_Command(u8 length, u8* data) {
|
u8* Data_Command(u8 wide, u8* ptr) {
|
||||||
int i;
|
int i;
|
||||||
u8 tx_data[128];
|
u8 tx_data[128];
|
||||||
//here are are inserting the data write command at the beginning
|
//here are are inserting the data write command at the beginning
|
||||||
tx_data[0] = 0x40;
|
tx_data[0] = 0x40;
|
||||||
length += 1;
|
wide += 1;
|
||||||
for (i = 1; i < length; i++) //Loop through the array of data
|
for (i = 1; i < wide; i++) //Loop through the array of data
|
||||||
tx_data[i] = *data++;
|
tx_data[i] = *ptr++;
|
||||||
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
I2C_PageWrite(tx_data, wide, DEVICEADDR_OLED); //write out the buffer
|
||||||
return data;
|
return ptr;
|
||||||
}
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function:Set_ShowPos
|
Function:Set_ShowPos
|
||||||
@@ -63,8 +74,10 @@ u8* Data_Command(u8 length, u8* data) {
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Set_ShowPos(u8 x, u8 y) {
|
void Set_ShowPos(u8 x, u8 y) {
|
||||||
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F };
|
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F };
|
||||||
|
|
||||||
pos_param[5] = x + 32;
|
pos_param[5] = x + 32;
|
||||||
pos_param[1] += y;
|
pos_param[1] += y;
|
||||||
|
|
||||||
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +108,20 @@ u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) {
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
Function:Clean_Char
|
||||||
|
Description:Overwries a square to off, used to overwrite a char
|
||||||
|
Inputs:(k) input X position char starts at, (wide) how many pixels wide the char is
|
||||||
|
*******************************************************************************/
|
||||||
|
void Clean_Char(int k, u8 wide) {
|
||||||
|
int i;
|
||||||
|
u8 tx_data[128];
|
||||||
|
|
||||||
|
memset(&tx_data[0], 0, wide);
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
Oled_DrawArea(k, i * 8, wide, 8, tx_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function:GPIO_Init_OLED
|
Function:GPIO_Init_OLED
|
||||||
Description:Init the outputs as needed for the OLED (in this case the RST line)
|
Description:Init the outputs as needed for the OLED (in this case the RST line)
|
||||||
@@ -115,11 +142,11 @@ void Init_Oled(void) {
|
|||||||
u8 param_len;
|
u8 param_len;
|
||||||
|
|
||||||
OLED_RST();
|
OLED_RST();
|
||||||
delayMs(2);
|
delayMs(2); //reset the oled
|
||||||
OLED_ACT(); //Toggling reset to reset the oled
|
OLED_ACT();
|
||||||
delayMs(2);
|
delayMs(2);
|
||||||
param_len = 46;
|
param_len = 46;
|
||||||
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
I2C_PageWrite((u8 *) gOled_param, param_len, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@@ -133,7 +160,6 @@ void Clear_Screen(void) {
|
|||||||
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OLED_DrawString(char* string, uint8_t length) {
|
void OLED_DrawString(char* string, uint8_t length) {
|
||||||
for (uint8_t i = 0; i < length; i++) {
|
for (uint8_t i = 0; i < length; i++) {
|
||||||
OLED_DrawChar(string[i], i * 14);
|
OLED_DrawChar(string[i], i * 14);
|
||||||
@@ -153,10 +179,6 @@ void OLED_DrawChar(char c, uint8_t x) {
|
|||||||
else if (c == ' ') {
|
else if (c == ' ') {
|
||||||
//blank on space bar
|
//blank on space bar
|
||||||
ptr += (36) * (14 * 2);
|
ptr += (36) * (14 * 2);
|
||||||
} else if (c == '<') {
|
|
||||||
ptr += (37) * (14 * 2);
|
|
||||||
} else if (c == '>') {
|
|
||||||
ptr += (38) * (14 * 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Oled_DrawArea(x, 0, 14, 16, (u8*) ptr);
|
Oled_DrawArea(x, 0, 14, 16, (u8*) ptr);
|
||||||
@@ -165,19 +187,22 @@ void OLED_DrawChar(char c, uint8_t x) {
|
|||||||
* Draw a 2 digit number to the display
|
* Draw a 2 digit number to the display
|
||||||
* */
|
* */
|
||||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
|
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
|
||||||
OLED_DrawChar((in / 10) % 10, x);
|
OLED_DrawChar((in / 10)%10, x);
|
||||||
OLED_DrawChar(in % 10, x + 14);
|
OLED_DrawChar(in % 10, x + 14);
|
||||||
}
|
}
|
||||||
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
|
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
|
||||||
|
|
||||||
OLED_DrawChar((in / 100) % 10, x);
|
OLED_DrawChar((in / 100)%10, x);
|
||||||
OLED_DrawChar((in / 10) % 10, x + 14);
|
OLED_DrawChar((in / 10)%10, x + 14);
|
||||||
OLED_DrawChar(in % 10, x + 28);
|
OLED_DrawChar(in % 10, x + 28);
|
||||||
}
|
}
|
||||||
void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
|
void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
|
||||||
|
|
||||||
OLED_DrawChar((in / 1000) % 10, x);
|
OLED_DrawChar((in / 1000)%10, x);
|
||||||
OLED_DrawChar((in / 100) % 10, x + 14);
|
OLED_DrawChar((in / 100)%10, x+14);
|
||||||
OLED_DrawChar((in / 10) % 10, x + 28);
|
OLED_DrawChar((in / 10)%10, x + 28);
|
||||||
OLED_DrawChar(in % 10, x + 42);
|
OLED_DrawChar(in % 10, x + 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************** END OF FILE *********************************/
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,17 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
#define MAXPIDOUTPUT 50000
|
#define MAXPIDOUTPUT 500000
|
||||||
//This function computes the new value for the ON time of the system
|
//This funtion computes the new value for the ON time of the system
|
||||||
//This is the return value from this function
|
//This is the return value from this function
|
||||||
int32_t computePID(uint16_t setpoint) {
|
int32_t computePID(uint16_t setpoint) {
|
||||||
|
static uint32_t lastSample = 0;
|
||||||
int32_t ITerm = 0;
|
int32_t ITerm = 0;
|
||||||
static int16_t lastReading = 0;
|
static int16_t lastReading = 0;
|
||||||
uint16_t currentReading = readIronTemp(0, 1); //get the current temp of the iron
|
if (millis() - lastSample > 25) {
|
||||||
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
|
//only sample every 50 milliseconds
|
||||||
|
uint16_t currentReading = readIronTemp(0,1); //get the current temp of the iron
|
||||||
|
int16_t error = (int16_t)setpoint - (int16_t)currentReading; //calculate the error term
|
||||||
ITerm += (pidSettings.ki * error);
|
ITerm += (pidSettings.ki * error);
|
||||||
if (ITerm > MAXPIDOUTPUT)
|
if (ITerm > MAXPIDOUTPUT)
|
||||||
ITerm = MAXPIDOUTPUT;
|
ITerm = MAXPIDOUTPUT;
|
||||||
@@ -27,12 +30,13 @@ int32_t computePID(uint16_t setpoint) {
|
|||||||
output = MAXPIDOUTPUT;
|
output = MAXPIDOUTPUT;
|
||||||
else if (output < 0)
|
else if (output < 0)
|
||||||
output = 0;
|
output = 0;
|
||||||
|
lastSample = millis();
|
||||||
lastReading = currentReading; //storing values for next iteration of the loop
|
lastReading = currentReading; //storing values for next iteration of the loop
|
||||||
return output;
|
return output;
|
||||||
|
}
|
||||||
|
return -1; //called too fast
|
||||||
}
|
}
|
||||||
/*Sets up the pid values*/
|
|
||||||
void setupPID(void) {
|
void setupPID(void) {
|
||||||
pidSettings.kp = 22;
|
pidSettings.kp = 22;
|
||||||
pidSettings.ki = 7;
|
pidSettings.ki = 7;
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* Settings.c
|
|
||||||
*
|
|
||||||
* Created on: 29 Sep 2016
|
|
||||||
* Author: Ralim
|
|
||||||
*
|
|
||||||
* This file holds the users settings and saves / restores them to the devices flash
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "Settings.h"
|
|
||||||
#define FLASH_ADDR (0x8000000|48896)
|
|
||||||
void saveSettings() {
|
|
||||||
//First we erase the flash
|
|
||||||
FLASH_Unlock(); //unlock flash writing
|
|
||||||
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
|
|
||||||
while (FLASH_ErasePage(FLASH_ADDR) != FLASH_COMPLETE)
|
|
||||||
; //wait for it
|
|
||||||
//erased the chunk
|
|
||||||
//now we program it
|
|
||||||
uint16_t *data = (uint16_t*) &systemSettings;
|
|
||||||
for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
|
|
||||||
FLASH_ProgramHalfWord(FLASH_ADDR + (i * 2), data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void restoreSettings() {
|
|
||||||
//We read the flash
|
|
||||||
uint16_t *data = (uint16_t*) &systemSettings;
|
|
||||||
for(uint8_t i=0;i<(sizeof(systemSettings)/2);i++)
|
|
||||||
{
|
|
||||||
data[i] = *(uint16_t *)(FLASH_ADDR + (i*2));
|
|
||||||
}
|
|
||||||
//if the version is correct were done
|
|
||||||
//if not we reset and save
|
|
||||||
if (systemSettings.version != SETTINGSVERSION) {
|
|
||||||
//probably not setup
|
|
||||||
resetSettings();
|
|
||||||
saveSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void resetSettings() {
|
|
||||||
|
|
||||||
systemSettings.SleepTemp = 900;
|
|
||||||
systemSettings.SleepTime = 1;
|
|
||||||
systemSettings.SolderingTemp = 3200;
|
|
||||||
systemSettings.movementEnabled = 1; //we use movement detection
|
|
||||||
systemSettings.cutoutVoltage = 9;
|
|
||||||
systemSettings.version=SETTINGSVERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user