yacwc
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/helpers_uart.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/camera_ptz.X/mcc_generated_files/examples/twi0_master_example.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/helpers_i2c.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/helpers_uart.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/main.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/main.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/birdptz.X/helpers_i2c.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/camera_ptz.X/mcc_generated_files/examples/twi0_master_example.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/camera_ptz.X/mcc_generated_files/src/twi0_master.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$(MP_EXTRA_CC_PRE) -mcpu=$(MP_PROCESSOR_OPTION) -c -D__DEBUG=1 -g -DDEBUG -gdwarf-2 -x c -D__$(MP_PROCESSOR_OPTION)__ -mdfp="${DFP_DIR}/xc8" -Wl,--gc-sections -O1 -ffunction-sections -fdata-sections -fshort-enums -funsigned-char -funsigned-bitfields -Wall -DXPRJ_default=$(CND_CONF) $(COMPARISON_BUILD) -gdwarf-3 /home/thebears/Seafile/Designs/AVR/camera_ptz.X/mcc_generated_files/src/twi0_master.c
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#
|
||||||
|
# Generated Makefile - do not edit!
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This file contains information about the location of compilers and other tools.
|
||||||
|
# If you commmit this file into your revision control server, you will be able to
|
||||||
|
# to checkout the project and build it from the command line with make. However,
|
||||||
|
# if more than one person works on the same project, then this file might show
|
||||||
|
# conflicts since different users are bound to have compilers in different places.
|
||||||
|
# In that case you might choose to not commit this file and let MPLAB X recreate this file
|
||||||
|
# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at
|
||||||
|
# least once so the file gets created and the project can be built. Finally, you can also
|
||||||
|
# avoid using this file at all if you are only building from the command line with make.
|
||||||
|
# You can invoke make with the values of the macros:
|
||||||
|
# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ...
|
||||||
|
#
|
||||||
|
PATH_TO_IDE_BIN=/opt/microchip/mplabx/v5.50/mplab_platform/platform/../mplab_ide/modules/../../bin/
|
||||||
|
# Adding MPLAB X bin directory to path.
|
||||||
|
PATH:=/opt/microchip/mplabx/v5.50/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH)
|
||||||
|
# Path to java used to run MPLAB X when this makefile was created
|
||||||
|
MP_JAVA_PATH="/opt/microchip/mplabx/v5.50/sys/java/zulu8.40.0.25-ca-fx-jre8.0.222-linux_x64/bin/"
|
||||||
|
OS_CURRENT="$(shell uname -s)"
|
||||||
|
MP_CC="/opt/microchip/xc8/v2.32/bin/xc8-cc"
|
||||||
|
# MP_CPPC is not defined
|
||||||
|
# MP_BC is not defined
|
||||||
|
MP_AS="/opt/microchip/xc8/v2.32/bin/xc8-cc"
|
||||||
|
MP_LD="/opt/microchip/xc8/v2.32/bin/xc8-cc"
|
||||||
|
MP_AR="/opt/microchip/xc8/v2.32/bin/xc8-ar"
|
||||||
|
DEP_GEN=${MP_JAVA_PATH}java -jar "/opt/microchip/mplabx/v5.50/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar"
|
||||||
|
MP_CC_DIR="/opt/microchip/xc8/v2.32/bin"
|
||||||
|
# MP_CPPC_DIR is not defined
|
||||||
|
# MP_BC_DIR is not defined
|
||||||
|
MP_AS_DIR="/opt/microchip/xc8/v2.32/bin"
|
||||||
|
MP_LD_DIR="/opt/microchip/xc8/v2.32/bin"
|
||||||
|
MP_AR_DIR="/opt/microchip/xc8/v2.32/bin"
|
||||||
|
# MP_BC_DIR is not defined
|
||||||
|
DFP_DIR=/opt/microchip/mplabx/v5.50/packs/Microchip/ATmega_DFP/2.3.126
|
||||||
113
Makefile
Normal file
113
Makefile
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#
|
||||||
|
# There exist several targets which are by default empty and which can be
|
||||||
|
# used for execution of your targets. These targets are usually executed
|
||||||
|
# before and after some main targets. They are:
|
||||||
|
#
|
||||||
|
# .build-pre: called before 'build' target
|
||||||
|
# .build-post: called after 'build' target
|
||||||
|
# .clean-pre: called before 'clean' target
|
||||||
|
# .clean-post: called after 'clean' target
|
||||||
|
# .clobber-pre: called before 'clobber' target
|
||||||
|
# .clobber-post: called after 'clobber' target
|
||||||
|
# .all-pre: called before 'all' target
|
||||||
|
# .all-post: called after 'all' target
|
||||||
|
# .help-pre: called before 'help' target
|
||||||
|
# .help-post: called after 'help' target
|
||||||
|
#
|
||||||
|
# Targets beginning with '.' are not intended to be called on their own.
|
||||||
|
#
|
||||||
|
# Main targets can be executed directly, and they are:
|
||||||
|
#
|
||||||
|
# build build a specific configuration
|
||||||
|
# clean remove built files from a configuration
|
||||||
|
# clobber remove all built files
|
||||||
|
# all build all configurations
|
||||||
|
# help print help mesage
|
||||||
|
#
|
||||||
|
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
|
||||||
|
# .help-impl are implemented in nbproject/makefile-impl.mk.
|
||||||
|
#
|
||||||
|
# Available make variables:
|
||||||
|
#
|
||||||
|
# CND_BASEDIR base directory for relative paths
|
||||||
|
# CND_DISTDIR default top distribution directory (build artifacts)
|
||||||
|
# CND_BUILDDIR default top build directory (object files, ...)
|
||||||
|
# CONF name of current configuration
|
||||||
|
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
|
||||||
|
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
|
||||||
|
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
|
||||||
|
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
|
||||||
|
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
|
||||||
|
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
|
||||||
|
#
|
||||||
|
# NOCDDL
|
||||||
|
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
MKDIR=mkdir
|
||||||
|
CP=cp
|
||||||
|
CCADMIN=CCadmin
|
||||||
|
RANLIB=ranlib
|
||||||
|
|
||||||
|
|
||||||
|
# build
|
||||||
|
build: .build-post
|
||||||
|
|
||||||
|
.build-pre:
|
||||||
|
# Add your pre 'build' code here...
|
||||||
|
|
||||||
|
.build-post: .build-impl
|
||||||
|
# Add your post 'build' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# clean
|
||||||
|
clean: .clean-post
|
||||||
|
|
||||||
|
.clean-pre:
|
||||||
|
# Add your pre 'clean' code here...
|
||||||
|
# WARNING: the IDE does not call this target since it takes a long time to
|
||||||
|
# simply run make. Instead, the IDE removes the configuration directories
|
||||||
|
# under build and dist directly without calling make.
|
||||||
|
# This target is left here so people can do a clean when running a clean
|
||||||
|
# outside the IDE.
|
||||||
|
|
||||||
|
.clean-post: .clean-impl
|
||||||
|
# Add your post 'clean' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# clobber
|
||||||
|
clobber: .clobber-post
|
||||||
|
|
||||||
|
.clobber-pre:
|
||||||
|
# Add your pre 'clobber' code here...
|
||||||
|
|
||||||
|
.clobber-post: .clobber-impl
|
||||||
|
# Add your post 'clobber' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# all
|
||||||
|
all: .all-post
|
||||||
|
|
||||||
|
.all-pre:
|
||||||
|
# Add your pre 'all' code here...
|
||||||
|
|
||||||
|
.all-post: .all-impl
|
||||||
|
# Add your post 'all' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# help
|
||||||
|
help: .help-post
|
||||||
|
|
||||||
|
.help-pre:
|
||||||
|
# Add your pre 'help' code here...
|
||||||
|
|
||||||
|
.help-post: .help-impl
|
||||||
|
# Add your post 'help' code here...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# include project implementation makefile
|
||||||
|
include nbproject/Makefile-impl.mk
|
||||||
|
|
||||||
|
# include project make variables
|
||||||
|
include nbproject/Makefile-variables.mk
|
||||||
80
compiler.h
Normal file
80
compiler.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef UTILS_COMPILER_H
|
||||||
|
#define UTILS_COMPILER_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup doc_driver_utils_compiler Compiler abstraction
|
||||||
|
* \ingroup doc_driver_utils
|
||||||
|
*
|
||||||
|
* Compiler abstraction layer and code utilities for 8-bit AVR.
|
||||||
|
* This module provides various abstraction layers and utilities
|
||||||
|
* to make code compatible between different compilers.
|
||||||
|
*
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/builtins.h>
|
||||||
|
#elif defined(__ICCAVR__)
|
||||||
|
#define ENABLE_BIT_DEFINITIONS 1
|
||||||
|
#include <ioavr.h>
|
||||||
|
#include <intrinsics.h>
|
||||||
|
|
||||||
|
#ifndef CCP_IOREG_gc
|
||||||
|
#define CCP_IOREG_gc 0xD8 /* CPU_CCP_IOREG_gc */
|
||||||
|
#endif
|
||||||
|
#ifndef CCP_SPM_gc
|
||||||
|
#define CCP_SPM_gc 0x9D /* CPU_CCP_SPM_gc */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unsupported compiler.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "interrupt_avr8.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def UNUSED
|
||||||
|
* \brief Marking \a v as a unused parameter or value.
|
||||||
|
*/
|
||||||
|
#define UNUSED(v) (void)(v)
|
||||||
|
|
||||||
|
#endif /* UTILS_COMPILER_H */
|
||||||
32
helpers_i2c.c
Normal file
32
helpers_i2c.c
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
#define TWI0_BAUD(F_SCL, T_RISE) \
|
||||||
|
((((((float)10000000 / (float)F_SCL)) - 10 - ((float)10000000 * T_RISE / 1000000))) / 2)
|
||||||
|
|
||||||
|
#include "helpers_i2c.h"
|
||||||
|
|
||||||
|
void i2c_init(void) {
|
||||||
|
PORTMUX.TWISPIROUTEA = 0x23;
|
||||||
|
TWI0.CTRLA = 0x14;
|
||||||
|
|
||||||
|
//Debug Run
|
||||||
|
TWI0.DBGCTRL = 0x00;
|
||||||
|
|
||||||
|
//Master Baud Rate Control
|
||||||
|
TWI0.MBAUD = (uint8_t)TWI0_BAUD(100000, 0);
|
||||||
|
|
||||||
|
//RIEN disabled; WIEN disabled; QCEN disabled; TIMEOUT DISABLED; SMEN disabled; ENABLE enabled;
|
||||||
|
TWI0.MCTRLA = 0x01;
|
||||||
|
|
||||||
|
//RIF disabled; WIF disabled; CLKHOLD disabled; ARBLOST disabled; BUSERR disabled; BUSSTATE UNKNOWN;
|
||||||
|
TWI0.MSTATUS = 0x00;
|
||||||
|
|
||||||
|
//Master Address
|
||||||
|
TWI0.MADDR = 0x00;
|
||||||
|
|
||||||
|
//FLUSH disabled; ACKACT ACK; MCMD NOACT;
|
||||||
|
TWI0.MCTRLB = 0x00;
|
||||||
|
|
||||||
|
//Master Data
|
||||||
|
TWI0.MDATA = 0x00;
|
||||||
|
|
||||||
|
};
|
||||||
23
helpers_i2c.h
Normal file
23
helpers_i2c.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// more than once.
|
||||||
|
#ifndef HELPER_I2C_H
|
||||||
|
#define HELPER_I2C_H
|
||||||
|
|
||||||
|
#include <xc.h> // include processor files - each processor file is guarded.
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
|
||||||
|
void i2c_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
// TODO If C++ is being used, regular C code needs function names to have C
|
||||||
|
// linkage so the functions can be used by the c code.
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* XC_HEADER_TEMPLATE_H */
|
||||||
|
|
||||||
94
helpers_uart.c
Normal file
94
helpers_uart.c
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#include "helpers_uart.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void USART0_init(void) {
|
||||||
|
PORTA.DIR &= ~PIN1_bm;
|
||||||
|
PORTA.DIR |= PIN0_bm;
|
||||||
|
|
||||||
|
USART0.BAUD = (uint16_t) USART0_BAUD_RATE(9600);
|
||||||
|
USART0.CTRLB |= USART_TXEN_bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void USART0_sendChar(char c) {
|
||||||
|
while (!(USART0.STATUS & USART_DREIF_bm)) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
USART0.TXDATAL = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void USART0_sendString(const char *str) {
|
||||||
|
for (size_t i = 0; i < strlen(str); i++) {
|
||||||
|
USART0_sendChar(str[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_print_uint16(uint16_t meas, const char* buf) {
|
||||||
|
|
||||||
|
sprintf(array, "%u", meas);
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(array);
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_print_float(float meas, const char* buf) {
|
||||||
|
dtostrf(meas, 3, 4, array);
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(array);
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void uart_print_bool(bool din, const char* buf)
|
||||||
|
{
|
||||||
|
USART0_sendString(" ");
|
||||||
|
if (din)
|
||||||
|
{
|
||||||
|
USART0_sendString("TRUE ");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
USART0_sendString("FALSE");
|
||||||
|
}
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_print_binary(unsigned char vin, const char* buf) {
|
||||||
|
|
||||||
|
USART0_sendString(" ");
|
||||||
|
|
||||||
|
int binary[9];
|
||||||
|
for (int n = 0; n < 8; n++)
|
||||||
|
binary[7 - n] = (vin >> n) & 1;
|
||||||
|
|
||||||
|
|
||||||
|
char str[1];
|
||||||
|
for (int n = 0; n < 8; n++) {
|
||||||
|
sprintf(str, "%d", binary[n]);
|
||||||
|
USART0_sendString(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart_print_uint8(uint8_t vin, const char* buf) {
|
||||||
|
|
||||||
|
USART0_sendString(" ");
|
||||||
|
sprintf(array, "%u", vin);
|
||||||
|
|
||||||
|
USART0_sendString(array);
|
||||||
|
USART0_sendString(" ");
|
||||||
|
USART0_sendString(buf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
68
helpers_uart.h
Normal file
68
helpers_uart.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/* Microchip Technology Inc. and its subsidiaries. You may use this software
|
||||||
|
* and any derivatives exclusively with Microchip products.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
|
||||||
|
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
|
||||||
|
* WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
|
||||||
|
*
|
||||||
|
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
|
||||||
|
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
|
||||||
|
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS
|
||||||
|
* IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF
|
||||||
|
* ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
|
||||||
|
* TERMS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File:
|
||||||
|
* Author:
|
||||||
|
* Comments:
|
||||||
|
* Revision history:
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This is a guard condition so that contents of this file are not included
|
||||||
|
// more than once.
|
||||||
|
#ifndef HELPER_UART_H
|
||||||
|
#define HELPER_UART_H
|
||||||
|
|
||||||
|
#include <xc.h> // include processor files - each processor file is guarded.
|
||||||
|
|
||||||
|
|
||||||
|
char array[16];
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define USART0_BAUD_RATE(BAUD_RATE) ((float)(3333333 * 64 / (16 * (float)BAUD_RATE)) + 0.5)
|
||||||
|
|
||||||
|
void USART0_init(void);
|
||||||
|
void USART0_sendChar(char c);
|
||||||
|
void USART0_sendString(const char *str);
|
||||||
|
void uart_print_uint16(uint16_t meas, const char* buf);
|
||||||
|
void uart_print_float(float meas, const char* buf);
|
||||||
|
void uart_print_binary(unsigned char vin, const char* buf);
|
||||||
|
void uart_print_uint8(uint8_t vin, const char* buf);
|
||||||
|
void uart_print_bool(bool din, const char* buf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
// TODO If C++ is being used, regular C code needs function names to have C
|
||||||
|
// linkage so the functions can be used by the c code.
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* XC_HEADER_TEMPLATE_H */
|
||||||
|
|
||||||
100
interrupt_avr8.h
Normal file
100
interrupt_avr8.h
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup doc_driver_utils_interrupts ISR abstraction
|
||||||
|
* \ingroup doc_driver_utils
|
||||||
|
*
|
||||||
|
* Interrupt-related functionality.
|
||||||
|
*
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTILS_INTERRUPT_AVR8_H
|
||||||
|
#define UTILS_INTERRUPT_AVR8_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \weakgroup interrupt_group
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef ISR_CUSTOM_H
|
||||||
|
#include ISR_CUSTOM_H
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def ISR
|
||||||
|
* \brief Define service routine for specified interrupt vector
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* \code
|
||||||
|
ISR(FOO_vect)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
*
|
||||||
|
* \param vect Interrupt vector name as found in the device header files.
|
||||||
|
*/
|
||||||
|
#if defined(__DOXYGEN__)
|
||||||
|
#define ISR(vect)
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#elif defined(__ICCAVR__)
|
||||||
|
#define __ISR(x) _Pragma(#x)
|
||||||
|
#define ISR(vect) __ISR(vector = vect) __interrupt void handler_##vect(void)
|
||||||
|
#endif
|
||||||
|
#endif // ISR_CUSTOM_H
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define cpu_irq_enable() sei()
|
||||||
|
#define cpu_irq_disable() cli()
|
||||||
|
#else
|
||||||
|
#define cpu_irq_enable() __enable_interrupt()
|
||||||
|
#define cpu_irq_disable() __disable_interrupt()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \weakgroup interrupt_deprecated_group
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
// Deprecated definitions.
|
||||||
|
#define Enable_global_interrupt() cpu_irq_enable()
|
||||||
|
#define Disable_global_interrupt() cpu_irq_disable()
|
||||||
|
#define Is_global_interrupt_enabled() cpu_irq_is_enabled()
|
||||||
|
//! @}
|
||||||
|
|
||||||
|
#endif /* UTILS_INTERRUPT_AVR8_H */
|
||||||
432
main.c
Normal file
432
main.c
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
/*
|
||||||
|
* File: main.c
|
||||||
|
* Author: thebears
|
||||||
|
*
|
||||||
|
* Created on September 13, 2021, 3:12 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define F_CPU 3333333
|
||||||
|
#define USART0_BAUD_RATE(BAUD_RATE) ((float)(3333333 * 64 / (16 * (float)BAUD_RATE)) + 0.5)
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "helpers_uart.h"
|
||||||
|
//#include "helpers_i2c.h"
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <xc.h>
|
||||||
|
#include "twi0_master_example.h"
|
||||||
|
uint16_t adcVal;
|
||||||
|
uint8_t val;
|
||||||
|
void ADC0_init(void);
|
||||||
|
uint16_t ADC0_read_a(void);
|
||||||
|
uint16_t ADC0_read_b(void);
|
||||||
|
bool limit_zoom = false;
|
||||||
|
bool limit_focus = false;
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t step_n_zoom = 0;
|
||||||
|
uint16_t step_n_focus = 0;
|
||||||
|
uint16_t step_n_iris = 0;
|
||||||
|
|
||||||
|
|
||||||
|
#define max_zoom_steps 2994
|
||||||
|
#define max_focus_steps 5180
|
||||||
|
#define max_iris_steps 77
|
||||||
|
uint8_t phase;
|
||||||
|
|
||||||
|
int8_t last_dir_zoom = 0;
|
||||||
|
int8_t last_dir_focus = 0;
|
||||||
|
|
||||||
|
bool focus_iris_max;
|
||||||
|
bool focus_iris_min;
|
||||||
|
bool focus_zoom_max;
|
||||||
|
bool focus_zoom_min;
|
||||||
|
bool focus_past_max;
|
||||||
|
bool focus_past_min;
|
||||||
|
// Zoom
|
||||||
|
#define m1_p1 2
|
||||||
|
#define m1_p2 3
|
||||||
|
#define m1_p3 4
|
||||||
|
#define m1_p4 5
|
||||||
|
#define deltime1 750
|
||||||
|
|
||||||
|
// Focus
|
||||||
|
#define m2_p1 5
|
||||||
|
#define m2_p2 4
|
||||||
|
#define m2_p3 1
|
||||||
|
#define m2_p4 0
|
||||||
|
#define deltime2 750
|
||||||
|
|
||||||
|
// P-Iris
|
||||||
|
#define m3_p1 4
|
||||||
|
#define m3_p2 5
|
||||||
|
#define m3_p3 6
|
||||||
|
#define m3_p4 7
|
||||||
|
#define deltime3 2500
|
||||||
|
|
||||||
|
#define delay_time 100
|
||||||
|
|
||||||
|
|
||||||
|
void step_phased(struct PORT_struct * p1, struct PORT_struct * p2, struct PORT_struct * p3, struct PORT_struct * p4, uint8_t m1, uint8_t m2, uint8_t m3, uint8_t m4, uint8_t phase) {
|
||||||
|
|
||||||
|
|
||||||
|
if (phase == 0) {
|
||||||
|
p1->OUTSET = _BV(m1);
|
||||||
|
p2->OUTCLR = _BV(m2);
|
||||||
|
p3->OUTSET = _BV(m3);
|
||||||
|
p4->OUTCLR = _BV(m4);
|
||||||
|
} else if (phase == 1) {
|
||||||
|
p1->OUTCLR = _BV(m1);
|
||||||
|
p2->OUTSET = _BV(m2);
|
||||||
|
p3->OUTSET = _BV(m3);
|
||||||
|
p4->OUTCLR = _BV(m4);
|
||||||
|
} else if (phase == 2) {
|
||||||
|
p1->OUTCLR = _BV(m1);
|
||||||
|
p2->OUTSET = _BV(m2);
|
||||||
|
p3->OUTCLR = _BV(m3);
|
||||||
|
p4->OUTSET = _BV(m4);
|
||||||
|
} else if (phase == 3) {
|
||||||
|
p1->OUTSET = _BV(m1);
|
||||||
|
p2->OUTCLR = _BV(m2);
|
||||||
|
p3->OUTCLR = _BV(m3);
|
||||||
|
p4->OUTSET = _BV(m4);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void step_iris_phased(int steps) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < abs(steps); i++) {
|
||||||
|
phase = abs(step_n_iris % 4);
|
||||||
|
focus_iris_max = (step_n_iris >= max_iris_steps) && (steps > 0);
|
||||||
|
focus_iris_min = (step_n_iris <= 0) && (steps < 0);
|
||||||
|
|
||||||
|
if (focus_iris_max || focus_iris_min) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
step_phased(&PORTC, &PORTC, &PORTC, &PORTC, m3_p1, m3_p2, m3_p3, m3_p4, phase);
|
||||||
|
_delay_us(deltime3);
|
||||||
|
if (steps > 0) {
|
||||||
|
step_n_iris++;
|
||||||
|
} else if (steps < 0) {
|
||||||
|
step_n_iris--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void step_zoom_phased(int steps) {
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < abs(steps); i++) {
|
||||||
|
phase = abs(step_n_zoom % 4);
|
||||||
|
focus_zoom_max = (step_n_zoom >= max_zoom_steps) && (steps > 0);
|
||||||
|
focus_zoom_min = (step_n_zoom <= 0) && (steps < 0);
|
||||||
|
if (focus_zoom_max || focus_zoom_min) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
step_phased(&PORTA, &PORTA, &PORTA, &PORTA, m1_p1, m1_p2, m1_p3, m1_p4, phase);
|
||||||
|
_delay_us(deltime1);
|
||||||
|
if (steps > 0) {
|
||||||
|
step_n_zoom++;
|
||||||
|
} else if (steps < 0) {
|
||||||
|
step_n_zoom--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void step_focus_phased(int steps) {
|
||||||
|
for (int i = 0; i < abs(steps); i++) {
|
||||||
|
focus_past_max = (step_n_focus >= max_focus_steps) && (steps > 0);
|
||||||
|
focus_past_min = (step_n_focus <= 0) && (steps < 0);
|
||||||
|
if (focus_past_max || focus_past_min) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
phase = abs(step_n_focus % 4);
|
||||||
|
step_phased(&PORTB, &PORTB, &PORTC, &PORTC, m2_p1, m2_p2, m2_p3, m2_p4, phase);
|
||||||
|
_delay_us(deltime2);
|
||||||
|
if (steps > 0) {
|
||||||
|
step_n_focus++;
|
||||||
|
} else if (steps < 0) {
|
||||||
|
step_n_focus--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool update_zoom_limit() {
|
||||||
|
if (PORTD.IN & PIN0_bm) {
|
||||||
|
limit_zoom = false;
|
||||||
|
} else {
|
||||||
|
limit_zoom = true;
|
||||||
|
}
|
||||||
|
return limit_zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool update_focus_limit() {
|
||||||
|
|
||||||
|
if (PORTD.IN & PIN1_bm) {
|
||||||
|
limit_focus = false;
|
||||||
|
} else {
|
||||||
|
limit_focus = true;
|
||||||
|
}
|
||||||
|
return limit_focus;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ir_filter_on() {
|
||||||
|
PORTB.OUTCLR = _BV(2);
|
||||||
|
PORTB.OUTSET = _BV(3);
|
||||||
|
_delay_ms(100);
|
||||||
|
PORTB.OUTCLR = _BV(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ir_filter_off() {
|
||||||
|
PORTB.OUTCLR = _BV(3);
|
||||||
|
PORTB.OUTSET = _BV(2);
|
||||||
|
_delay_ms(100);
|
||||||
|
PORTB.OUTCLR = _BV(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void home_focus() {
|
||||||
|
step_n_focus = max_focus_steps + 200;
|
||||||
|
step_focus_phased(-100);
|
||||||
|
for (int i = 0; i < max_focus_steps; i++) {
|
||||||
|
step_focus_phased(-1);
|
||||||
|
if (update_focus_limit()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
step_n_focus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void home_zoom() {
|
||||||
|
step_n_zoom = max_zoom_steps + 200;
|
||||||
|
step_zoom_phased(-100);
|
||||||
|
for (int i = 0; i < max_zoom_steps; i++) {
|
||||||
|
step_zoom_phased(-1);
|
||||||
|
if (update_zoom_limit()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
step_n_zoom = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void home_iris() {
|
||||||
|
step_n_iris = max_iris_steps + 200;
|
||||||
|
step_iris_phased(-100);
|
||||||
|
step_n_iris = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PORTD_PORT_vect) {
|
||||||
|
|
||||||
|
if (PORTD.INTFLAGS & PIN1_bm) {
|
||||||
|
update_focus_limit();
|
||||||
|
PORTD.INTFLAGS &= PIN1_bm;
|
||||||
|
} else if (PORTD.INTFLAGS & PIN0_bm) {
|
||||||
|
update_zoom_limit();
|
||||||
|
PORTD.INTFLAGS &= PIN0_bm;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
|
||||||
|
PORTA.OUTSET = _BV(6);
|
||||||
|
|
||||||
|
|
||||||
|
PORTD.DIRCLR = PIN0_bm;
|
||||||
|
PORTD.DIRCLR = PIN1_bm;
|
||||||
|
|
||||||
|
PORTD.PIN0CTRL |= PORT_ISC_BOTHEDGES_gc;
|
||||||
|
PORTD.PIN1CTRL |= PORT_ISC_BOTHEDGES_gc;
|
||||||
|
|
||||||
|
// Turn on 3.3V relay
|
||||||
|
PORTA.DIRSET = _BV(6);
|
||||||
|
|
||||||
|
|
||||||
|
// Zoom
|
||||||
|
PORTA.DIRSET = _BV(m1_p1);
|
||||||
|
PORTA.DIRSET = _BV(m1_p4);
|
||||||
|
PORTA.DIRSET = _BV(m1_p2);
|
||||||
|
PORTA.DIRSET = _BV(m1_p3);
|
||||||
|
|
||||||
|
// Focus
|
||||||
|
PORTB.DIRSET = _BV(m2_p1);
|
||||||
|
PORTB.DIRSET = _BV(m2_p2);
|
||||||
|
PORTC.DIRSET = _BV(m2_p3);
|
||||||
|
PORTC.DIRSET = _BV(m2_p4);
|
||||||
|
|
||||||
|
// Iris motor
|
||||||
|
PORTC.DIRSET = _BV(m3_p1);
|
||||||
|
PORTC.DIRSET = _BV(m3_p2);
|
||||||
|
PORTC.DIRSET = _BV(m3_p3);
|
||||||
|
PORTC.DIRSET = _BV(m3_p4);
|
||||||
|
|
||||||
|
// IR Filter
|
||||||
|
PORTB.DIRSET = _BV(2);
|
||||||
|
PORTB.DIRSET = _BV(3);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// sei();
|
||||||
|
PORTMUX.TWISPIROUTEA = 0x23;
|
||||||
|
|
||||||
|
_delay_ms(250);
|
||||||
|
I2C0_Initialize();
|
||||||
|
I2C0_example_write1ByteRegister(32, 0x00, 0x00);
|
||||||
|
I2C0_example_write1ByteRegister(32, 0x09, 0xFF);
|
||||||
|
USART0_init();
|
||||||
|
USART0_sendString("Started\n");
|
||||||
|
|
||||||
|
_delay_ms(250);
|
||||||
|
I2C0_example_write1ByteRegister(32, 0x09, 0x00);
|
||||||
|
_delay_ms(250);
|
||||||
|
I2C0_example_write1ByteRegister(32, 0x09, 0xFF);
|
||||||
|
|
||||||
|
USART0_sendString("focus->");
|
||||||
|
home_focus();
|
||||||
|
USART0_sendString("\niris->");
|
||||||
|
home_iris();
|
||||||
|
USART0_sendString("\nhome->");
|
||||||
|
home_zoom();
|
||||||
|
USART0_sendString("\n");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
step_zoom_phased(6000);
|
||||||
|
step_iris_phased(100);
|
||||||
|
step_focus_phased(2000);
|
||||||
|
|
||||||
|
|
||||||
|
step_zoom_phased(-6000);
|
||||||
|
//
|
||||||
|
step_iris_phased(-100);
|
||||||
|
step_focus_phased(-2000);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_delay_ms(250);
|
||||||
|
|
||||||
|
// ir_filter_off();
|
||||||
|
// step_iris_phased(76);
|
||||||
|
// step_iris_phased(-76);
|
||||||
|
// _delay_ms(25);
|
||||||
|
// ir_filter_on();
|
||||||
|
// step_iris(19);
|
||||||
|
//_delay_ms(250);
|
||||||
|
|
||||||
|
// _delay_ms(500);
|
||||||
|
|
||||||
|
// _delay_ms(500);
|
||||||
|
//
|
||||||
|
// step_focus(1000);
|
||||||
|
// step_focus(-1000);
|
||||||
|
// limit_focus = false;
|
||||||
|
// step_focus(-1000);
|
||||||
|
// limit_focus = false;
|
||||||
|
// step_zoom(1000);
|
||||||
|
// limit_zoom = false;
|
||||||
|
// step_zoom(-1000);
|
||||||
|
// limit_zoom = false;
|
||||||
|
|
||||||
|
// step_focus(1000);
|
||||||
|
// if (limit_focus)
|
||||||
|
// {
|
||||||
|
// limit_focus = false;
|
||||||
|
// step_focus(-1000);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// step(1000);
|
||||||
|
// step2(1000);
|
||||||
|
|
||||||
|
// _delay_ms(100);
|
||||||
|
USART0_sendString("-");
|
||||||
|
|
||||||
|
// uart_print_uint8(PORTD.IN & PIN0_bm,"p0 ");
|
||||||
|
// uart_print_uint8(PORTD.IN & PIN1_bm,"p1 \n ")
|
||||||
|
// step2(1000);
|
||||||
|
// PORTA.OUTSET = _BV(m1_p1);
|
||||||
|
// PORTA.OUTSET = _BV(m1_p2);
|
||||||
|
// PORTA.OUTSET = _BV(m1_p3);
|
||||||
|
// PORTA.OUTSET = _BV(m1_p4);
|
||||||
|
//
|
||||||
|
// PORTB.OUTSET = _BV(m2_p1);
|
||||||
|
// PORTB.OUTSET = _BV(m2_p2);
|
||||||
|
// PORTC.OUTSET = _BV(m2_p3);
|
||||||
|
// PORTC.OUTSET = _BV(m2_p4);
|
||||||
|
|
||||||
|
// uart_print_binary(val, " \n");
|
||||||
|
// adcVal = ADC0_read_a();
|
||||||
|
// uart_print_uint8(adcVal, " ");
|
||||||
|
// adcVal = ADC0_read_b();
|
||||||
|
// uart_print_uint8(adcVal, " ");
|
||||||
|
|
||||||
|
// step();
|
||||||
|
// step2();
|
||||||
|
// USART0_sendString("---\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADC0_init(void) {
|
||||||
|
|
||||||
|
PORTD.PIN0CTRL &= ~PORT_ISC_gm;
|
||||||
|
PORTD.PIN0CTRL |= PORT_ISC_INPUT_DISABLE_gc;
|
||||||
|
PORTD.PIN0CTRL &= ~PORT_PULLUPEN_bm;
|
||||||
|
|
||||||
|
PORTD.PIN1CTRL &= ~PORT_ISC_gm;
|
||||||
|
PORTD.PIN1CTRL |= PORT_ISC_INPUT_DISABLE_gc;
|
||||||
|
PORTD.PIN1CTRL &= ~PORT_PULLUPEN_bm;
|
||||||
|
|
||||||
|
ADC0.CTRLC = ADC_PRESC_DIV4_gc
|
||||||
|
| ADC_REFSEL_VDDREF_gc;
|
||||||
|
ADC0.CTRLA = ADC_ENABLE_bm /* ADC Enable: enabled */
|
||||||
|
| ADC_RESSEL_10BIT_gc; /* 10-bit mode */
|
||||||
|
/* Select ADC channel */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t ADC0_read_a(void) {
|
||||||
|
/* Start ADC conversion */
|
||||||
|
/* Start ADC conversion */
|
||||||
|
ADC0.MUXPOS = ADC_MUXPOS_AIN0_gc;
|
||||||
|
ADC0.COMMAND = ADC_STCONV_bm;
|
||||||
|
/* Wait until ADC conversion done */
|
||||||
|
while (!(ADC0.INTFLAGS & ADC_RESRDY_bm)) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
/* Clear the interrupt flag by writing 1: */
|
||||||
|
ADC0.INTFLAGS = ADC_RESRDY_bm;
|
||||||
|
return ADC0.RES;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t ADC0_read_b(void) {
|
||||||
|
/* Start ADC conversion */
|
||||||
|
/* Start ADC conversion */
|
||||||
|
ADC0.MUXPOS = ADC_MUXPOS_AIN1_gc;
|
||||||
|
ADC0.COMMAND = ADC_STCONV_bm;
|
||||||
|
/* Wait until ADC conversion done */
|
||||||
|
while (!(ADC0.INTFLAGS & ADC_RESRDY_bm)) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
/* Clear the interrupt flag by writing 1: */
|
||||||
|
ADC0.INTFLAGS = ADC_RESRDY_bm;
|
||||||
|
return ADC0.RES;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configurationDescriptor version="65">
|
||||||
|
<logicalFolder name="root" displayName="root" projectFiles="true">
|
||||||
|
<logicalFolder name="HeaderFiles"
|
||||||
|
displayName="Header Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>helpers_uart.h</itemPath>
|
||||||
|
<itemPath>helpers_i2c.h</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="LinkerScript"
|
||||||
|
displayName="Linker Files"
|
||||||
|
projectFiles="true">
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="SourceFiles"
|
||||||
|
displayName="Source Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>helpers_uart.c</itemPath>
|
||||||
|
<itemPath>helpers_i2c.c</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="ExternalFiles"
|
||||||
|
displayName="Important Files"
|
||||||
|
projectFiles="false">
|
||||||
|
<itemPath>Makefile</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<itemPath>main.c</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/src/twi0_master.c</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/include/twi0_master.h</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/examples/twi0_master_example.c</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/examples/twi0_master_example.h</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<sourceRootList>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/src</Elem>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/include</Elem>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/examples</Elem>
|
||||||
|
</sourceRootList>
|
||||||
|
<projectmakefile>Makefile</projectmakefile>
|
||||||
|
<confs>
|
||||||
|
<conf name="default" type="2">
|
||||||
|
<toolsSet>
|
||||||
|
<developmentServer>localhost</developmentServer>
|
||||||
|
<targetDevice>ATmega4809</targetDevice>
|
||||||
|
<targetHeader></targetHeader>
|
||||||
|
<targetPluginBoard></targetPluginBoard>
|
||||||
|
<platformTool>AtmelIceTool</platformTool>
|
||||||
|
<languageToolchain>XC8</languageToolchain>
|
||||||
|
<languageToolchainVersion>2.32</languageToolchainVersion>
|
||||||
|
<platform>2</platform>
|
||||||
|
</toolsSet>
|
||||||
|
<packs>
|
||||||
|
<pack name="ATmega_DFP" vendor="Microchip" version="2.3.126"/>
|
||||||
|
</packs>
|
||||||
|
<ScriptingSettings>
|
||||||
|
</ScriptingSettings>
|
||||||
|
<compileType>
|
||||||
|
<linkerTool>
|
||||||
|
<linkerLibItems>
|
||||||
|
</linkerLibItems>
|
||||||
|
</linkerTool>
|
||||||
|
<archiverTool>
|
||||||
|
</archiverTool>
|
||||||
|
<loading>
|
||||||
|
<useAlternateLoadableFile>false</useAlternateLoadableFile>
|
||||||
|
<parseOnProdLoad>false</parseOnProdLoad>
|
||||||
|
<alternateLoadableFile></alternateLoadableFile>
|
||||||
|
</loading>
|
||||||
|
<subordinates>
|
||||||
|
</subordinates>
|
||||||
|
</compileType>
|
||||||
|
<makeCustomizationType>
|
||||||
|
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
|
||||||
|
<makeUseCleanTarget>false</makeUseCleanTarget>
|
||||||
|
<makeCustomizationPreStep></makeCustomizationPreStep>
|
||||||
|
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
|
||||||
|
<makeCustomizationPostStep></makeCustomizationPostStep>
|
||||||
|
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
|
||||||
|
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines>
|
||||||
|
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
|
||||||
|
</makeCustomizationType>
|
||||||
|
<AtmelIceTool>
|
||||||
|
<property key="AutoSelectMemRanges" value="auto"/>
|
||||||
|
<property key="communication.activationmode" value="nohv"/>
|
||||||
|
<property key="communication.interface" value="updi"/>
|
||||||
|
<property key="communication.speed" value="0.500"/>
|
||||||
|
<property key="debugoptions.useswbreakpoints" value="false"/>
|
||||||
|
<property key="firmware.path"
|
||||||
|
value="Press to browse for a specific firmware version"/>
|
||||||
|
<property key="firmware.toolpack"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="firmware.update.action" value="firmware.update.use.latest"/>
|
||||||
|
<property key="freeze.timers" value="false"/>
|
||||||
|
<property key="memories.aux" value="false"/>
|
||||||
|
<property key="memories.bootflash" value="true"/>
|
||||||
|
<property key="memories.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.configurationmemory2" value="true"/>
|
||||||
|
<property key="memories.dataflash" value="true"/>
|
||||||
|
<property key="memories.eeprom" value="true"/>
|
||||||
|
<property key="memories.exclude.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.flashdata" value="true"/>
|
||||||
|
<property key="memories.id" value="true"/>
|
||||||
|
<property key="memories.instruction.ram.ranges"
|
||||||
|
value="${memories.instruction.ram.ranges}"/>
|
||||||
|
<property key="memories.programmemory" value="true"/>
|
||||||
|
<property key="memories.programmemory.ranges" value="0-5fff"/>
|
||||||
|
<property key="memories.rww" value="true"/>
|
||||||
|
<property key="poweroptions.powerenable" value="false"/>
|
||||||
|
<property key="programoptions.eraseb4program" value="true"/>
|
||||||
|
<property key="programoptions.preservedataflash" value="false"/>
|
||||||
|
<property key="programoptions.preservedataflash.ranges"
|
||||||
|
value="${memories.dataflash.default}"/>
|
||||||
|
<property key="programoptions.preserveeeprom" value="false"/>
|
||||||
|
<property key="programoptions.preserveeeprom.ranges" value="1400-14ff"/>
|
||||||
|
<property key="programoptions.preserveprogram.ranges" value=""/>
|
||||||
|
<property key="programoptions.preserveprogramrange" value="false"/>
|
||||||
|
<property key="programoptions.preserveuserid" value="false"/>
|
||||||
|
<property key="programoptions.programuserotp" value="false"/>
|
||||||
|
<property key="toolpack.updateoptions"
|
||||||
|
value="toolpack.updateoptions.uselatestoolpack"/>
|
||||||
|
<property key="toolpack.updateoptions.packversion"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="voltagevalue" value=""/>
|
||||||
|
</AtmelIceTool>
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
<property key="additional-warnings" value="true"/>
|
||||||
|
<property key="asmlist" value="true"/>
|
||||||
|
<property key="call-prologues" value="false"/>
|
||||||
|
<property key="default-bitfield-type" value="true"/>
|
||||||
|
<property key="default-char-type" value="true"/>
|
||||||
|
<property key="define-macros" value=""/>
|
||||||
|
<property key="disable-optimizations" value="false"/>
|
||||||
|
<property key="extra-include-directories" value=""/>
|
||||||
|
<property key="favor-optimization-for" value="-speed,+space"/>
|
||||||
|
<property key="garbage-collect-data" value="true"/>
|
||||||
|
<property key="garbage-collect-functions" value="true"/>
|
||||||
|
<property key="identifier-length" value="255"/>
|
||||||
|
<property key="local-generation" value="false"/>
|
||||||
|
<property key="operation-mode" value="free"/>
|
||||||
|
<property key="opt-xc8-compiler-strict_ansi" value="false"/>
|
||||||
|
<property key="optimization-assembler" value="true"/>
|
||||||
|
<property key="optimization-assembler-files" value="true"/>
|
||||||
|
<property key="optimization-debug" value="false"/>
|
||||||
|
<property key="optimization-invariant-enable" value="false"/>
|
||||||
|
<property key="optimization-invariant-value" value="16"/>
|
||||||
|
<property key="optimization-level" value="-O1"/>
|
||||||
|
<property key="optimization-speed" value="false"/>
|
||||||
|
<property key="optimization-stable-enable" value="false"/>
|
||||||
|
<property key="preprocess-assembler" value="true"/>
|
||||||
|
<property key="short-enums" value="true"/>
|
||||||
|
<property key="tentative-definitions" value=""/>
|
||||||
|
<property key="undefine-macros" value=""/>
|
||||||
|
<property key="use-cci" value="false"/>
|
||||||
|
<property key="use-iar" value="false"/>
|
||||||
|
<property key="verbose" value="false"/>
|
||||||
|
<property key="warning-level" value="-3"/>
|
||||||
|
<property key="what-to-do" value="ignore"/>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
<property key="additional-options-checksum" value=""/>
|
||||||
|
<property key="additional-options-code-offset" value=""/>
|
||||||
|
<property key="additional-options-command-line" value=""/>
|
||||||
|
<property key="additional-options-errata" value=""/>
|
||||||
|
<property key="additional-options-extend-address" value="false"/>
|
||||||
|
<property key="additional-options-trace-type" value=""/>
|
||||||
|
<property key="additional-options-use-response-files" value="false"/>
|
||||||
|
<property key="backup-reset-condition-flags" value="false"/>
|
||||||
|
<property key="calibrate-oscillator" value="false"/>
|
||||||
|
<property key="calibrate-oscillator-value" value="0x3400"/>
|
||||||
|
<property key="clear-bss" value="true"/>
|
||||||
|
<property key="code-model-external" value="wordwrite"/>
|
||||||
|
<property key="code-model-rom" value=""/>
|
||||||
|
<property key="create-html-files" value="false"/>
|
||||||
|
<property key="data-model-ram" value=""/>
|
||||||
|
<property key="data-model-size-of-double" value="24"/>
|
||||||
|
<property key="data-model-size-of-double-gcc" value="no-short-double"/>
|
||||||
|
<property key="data-model-size-of-float" value="24"/>
|
||||||
|
<property key="data-model-size-of-float-gcc" value="no-short-float"/>
|
||||||
|
<property key="display-class-usage" value="false"/>
|
||||||
|
<property key="display-hex-usage" value="false"/>
|
||||||
|
<property key="display-overall-usage" value="true"/>
|
||||||
|
<property key="display-psect-usage" value="false"/>
|
||||||
|
<property key="extra-lib-directories" value=""/>
|
||||||
|
<property key="fill-flash-options-addr" value=""/>
|
||||||
|
<property key="fill-flash-options-const" value=""/>
|
||||||
|
<property key="fill-flash-options-how" value="0"/>
|
||||||
|
<property key="fill-flash-options-inc-const" value="1"/>
|
||||||
|
<property key="fill-flash-options-increment" value=""/>
|
||||||
|
<property key="fill-flash-options-seq" value=""/>
|
||||||
|
<property key="fill-flash-options-what" value="0"/>
|
||||||
|
<property key="format-hex-file-for-download" value="false"/>
|
||||||
|
<property key="initialize-data" value="true"/>
|
||||||
|
<property key="input-libraries" value="libm"/>
|
||||||
|
<property key="keep-generated-startup.as" value="false"/>
|
||||||
|
<property key="link-in-c-library" value="true"/>
|
||||||
|
<property key="link-in-c-library-gcc" value=""/>
|
||||||
|
<property key="link-in-peripheral-library" value="false"/>
|
||||||
|
<property key="managed-stack" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-file" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-link_startup" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-serial" value=""/>
|
||||||
|
<property key="program-the-device-with-default-config-words" value="true"/>
|
||||||
|
<property key="remove-unused-sections" value="true"/>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<Tool>
|
||||||
|
<property key="AutoSelectMemRanges" value="auto"/>
|
||||||
|
<property key="communication.activationmode" value="nohv"/>
|
||||||
|
<property key="communication.interface" value="updi"/>
|
||||||
|
<property key="communication.speed" value="0.500"/>
|
||||||
|
<property key="debugoptions.useswbreakpoints" value="false"/>
|
||||||
|
<property key="firmware.path"
|
||||||
|
value="Press to browse for a specific firmware version"/>
|
||||||
|
<property key="firmware.toolpack"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="firmware.update.action" value="firmware.update.use.latest"/>
|
||||||
|
<property key="freeze.timers" value="false"/>
|
||||||
|
<property key="memories.aux" value="false"/>
|
||||||
|
<property key="memories.bootflash" value="true"/>
|
||||||
|
<property key="memories.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.configurationmemory2" value="true"/>
|
||||||
|
<property key="memories.dataflash" value="true"/>
|
||||||
|
<property key="memories.eeprom" value="true"/>
|
||||||
|
<property key="memories.exclude.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.flashdata" value="true"/>
|
||||||
|
<property key="memories.id" value="true"/>
|
||||||
|
<property key="memories.instruction.ram.ranges"
|
||||||
|
value="${memories.instruction.ram.ranges}"/>
|
||||||
|
<property key="memories.programmemory" value="true"/>
|
||||||
|
<property key="memories.programmemory.ranges" value="0-5fff"/>
|
||||||
|
<property key="memories.rww" value="true"/>
|
||||||
|
<property key="poweroptions.powerenable" value="false"/>
|
||||||
|
<property key="programoptions.eraseb4program" value="true"/>
|
||||||
|
<property key="programoptions.preservedataflash" value="false"/>
|
||||||
|
<property key="programoptions.preservedataflash.ranges"
|
||||||
|
value="${memories.dataflash.default}"/>
|
||||||
|
<property key="programoptions.preserveeeprom" value="false"/>
|
||||||
|
<property key="programoptions.preserveeeprom.ranges" value="1400-14ff"/>
|
||||||
|
<property key="programoptions.preserveprogram.ranges" value=""/>
|
||||||
|
<property key="programoptions.preserveprogramrange" value="false"/>
|
||||||
|
<property key="programoptions.preserveuserid" value="false"/>
|
||||||
|
<property key="programoptions.programuserotp" value="false"/>
|
||||||
|
<property key="toolpack.updateoptions"
|
||||||
|
value="toolpack.updateoptions.uselatestoolpack"/>
|
||||||
|
<property key="toolpack.updateoptions.packversion"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="voltagevalue" value=""/>
|
||||||
|
</Tool>
|
||||||
|
<XC8-CO>
|
||||||
|
<property key="coverage-enable" value=""/>
|
||||||
|
<property key="stack-guidance" value="false"/>
|
||||||
|
</XC8-CO>
|
||||||
|
<XC8-config-global>
|
||||||
|
<property key="advanced-elf" value="true"/>
|
||||||
|
<property key="gcc-opt-driver-new" value="true"/>
|
||||||
|
<property key="gcc-opt-std" value="-std=c99"/>
|
||||||
|
<property key="gcc-output-file-format" value="dwarf-3"/>
|
||||||
|
<property key="omit-pack-options" value="false"/>
|
||||||
|
<property key="omit-pack-options-new" value="1"/>
|
||||||
|
<property key="output-file-format" value="-mcof,+elf"/>
|
||||||
|
<property key="stack-size-high" value="auto"/>
|
||||||
|
<property key="stack-size-low" value="auto"/>
|
||||||
|
<property key="stack-size-main" value="auto"/>
|
||||||
|
<property key="stack-type" value="compiled"/>
|
||||||
|
<property key="user-pack-device-support" value=""/>
|
||||||
|
<property key="wpo-lto" value="false"/>
|
||||||
|
</XC8-config-global>
|
||||||
|
</conf>
|
||||||
|
</confs>
|
||||||
|
</configurationDescriptor>
|
||||||
266
nbproject/configurations.xml
Normal file
266
nbproject/configurations.xml
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configurationDescriptor version="65">
|
||||||
|
<logicalFolder name="root" displayName="root" projectFiles="true">
|
||||||
|
<logicalFolder name="HeaderFiles"
|
||||||
|
displayName="Header Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>helpers_uart.h</itemPath>
|
||||||
|
<itemPath>helpers_i2c.h</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/include/twi0_master.h</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/examples/twi0_master_example.h</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="LinkerScript"
|
||||||
|
displayName="Linker Files"
|
||||||
|
projectFiles="true">
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="SourceFiles"
|
||||||
|
displayName="Source Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>helpers_uart.c</itemPath>
|
||||||
|
<itemPath>helpers_i2c.c</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/src/twi0_master.c</itemPath>
|
||||||
|
<itemPath>../camera_ptz.X/mcc_generated_files/examples/twi0_master_example.c</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="ExternalFiles"
|
||||||
|
displayName="Important Files"
|
||||||
|
projectFiles="false">
|
||||||
|
<itemPath>Makefile</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<itemPath>main.c</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<sourceRootList>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/src</Elem>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/include</Elem>
|
||||||
|
<Elem>../camera_ptz.X/mcc_generated_files/examples</Elem>
|
||||||
|
</sourceRootList>
|
||||||
|
<projectmakefile>Makefile</projectmakefile>
|
||||||
|
<confs>
|
||||||
|
<conf name="default" type="2">
|
||||||
|
<toolsSet>
|
||||||
|
<developmentServer>localhost</developmentServer>
|
||||||
|
<targetDevice>ATmega4809</targetDevice>
|
||||||
|
<targetHeader></targetHeader>
|
||||||
|
<targetPluginBoard></targetPluginBoard>
|
||||||
|
<platformTool>AtmelIceTool</platformTool>
|
||||||
|
<languageToolchain>XC8</languageToolchain>
|
||||||
|
<languageToolchainVersion>2.32</languageToolchainVersion>
|
||||||
|
<platform>2</platform>
|
||||||
|
</toolsSet>
|
||||||
|
<packs>
|
||||||
|
<pack name="ATmega_DFP" vendor="Microchip" version="2.3.126"/>
|
||||||
|
</packs>
|
||||||
|
<ScriptingSettings>
|
||||||
|
</ScriptingSettings>
|
||||||
|
<compileType>
|
||||||
|
<linkerTool>
|
||||||
|
<linkerLibItems>
|
||||||
|
</linkerLibItems>
|
||||||
|
</linkerTool>
|
||||||
|
<archiverTool>
|
||||||
|
</archiverTool>
|
||||||
|
<loading>
|
||||||
|
<useAlternateLoadableFile>false</useAlternateLoadableFile>
|
||||||
|
<parseOnProdLoad>false</parseOnProdLoad>
|
||||||
|
<alternateLoadableFile></alternateLoadableFile>
|
||||||
|
</loading>
|
||||||
|
<subordinates>
|
||||||
|
</subordinates>
|
||||||
|
</compileType>
|
||||||
|
<makeCustomizationType>
|
||||||
|
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
|
||||||
|
<makeUseCleanTarget>false</makeUseCleanTarget>
|
||||||
|
<makeCustomizationPreStep></makeCustomizationPreStep>
|
||||||
|
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
|
||||||
|
<makeCustomizationPostStep></makeCustomizationPostStep>
|
||||||
|
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
|
||||||
|
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines>
|
||||||
|
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
|
||||||
|
</makeCustomizationType>
|
||||||
|
<AtmelIceTool>
|
||||||
|
<property key="AutoSelectMemRanges" value="auto"/>
|
||||||
|
<property key="communication.activationmode" value="nohv"/>
|
||||||
|
<property key="communication.interface" value="updi"/>
|
||||||
|
<property key="communication.speed" value="0.500"/>
|
||||||
|
<property key="debugoptions.useswbreakpoints" value="false"/>
|
||||||
|
<property key="firmware.path"
|
||||||
|
value="Press to browse for a specific firmware version"/>
|
||||||
|
<property key="firmware.toolpack"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="firmware.update.action" value="firmware.update.use.latest"/>
|
||||||
|
<property key="freeze.timers" value="false"/>
|
||||||
|
<property key="memories.aux" value="false"/>
|
||||||
|
<property key="memories.bootflash" value="true"/>
|
||||||
|
<property key="memories.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.configurationmemory2" value="true"/>
|
||||||
|
<property key="memories.dataflash" value="true"/>
|
||||||
|
<property key="memories.eeprom" value="true"/>
|
||||||
|
<property key="memories.exclude.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.flashdata" value="true"/>
|
||||||
|
<property key="memories.id" value="true"/>
|
||||||
|
<property key="memories.instruction.ram.ranges"
|
||||||
|
value="${memories.instruction.ram.ranges}"/>
|
||||||
|
<property key="memories.programmemory" value="true"/>
|
||||||
|
<property key="memories.programmemory.ranges" value="0-5fff"/>
|
||||||
|
<property key="memories.rww" value="true"/>
|
||||||
|
<property key="poweroptions.powerenable" value="false"/>
|
||||||
|
<property key="programoptions.eraseb4program" value="true"/>
|
||||||
|
<property key="programoptions.preservedataflash" value="false"/>
|
||||||
|
<property key="programoptions.preservedataflash.ranges"
|
||||||
|
value="${memories.dataflash.default}"/>
|
||||||
|
<property key="programoptions.preserveeeprom" value="false"/>
|
||||||
|
<property key="programoptions.preserveeeprom.ranges" value="1400-14ff"/>
|
||||||
|
<property key="programoptions.preserveprogram.ranges" value=""/>
|
||||||
|
<property key="programoptions.preserveprogramrange" value="false"/>
|
||||||
|
<property key="programoptions.preserveuserid" value="false"/>
|
||||||
|
<property key="programoptions.programuserotp" value="false"/>
|
||||||
|
<property key="toolpack.updateoptions"
|
||||||
|
value="toolpack.updateoptions.uselatestoolpack"/>
|
||||||
|
<property key="toolpack.updateoptions.packversion"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="voltagevalue" value=""/>
|
||||||
|
</AtmelIceTool>
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
<property key="additional-warnings" value="true"/>
|
||||||
|
<property key="asmlist" value="true"/>
|
||||||
|
<property key="call-prologues" value="false"/>
|
||||||
|
<property key="default-bitfield-type" value="true"/>
|
||||||
|
<property key="default-char-type" value="true"/>
|
||||||
|
<property key="define-macros" value=""/>
|
||||||
|
<property key="disable-optimizations" value="false"/>
|
||||||
|
<property key="extra-include-directories" value=""/>
|
||||||
|
<property key="favor-optimization-for" value="-speed,+space"/>
|
||||||
|
<property key="garbage-collect-data" value="true"/>
|
||||||
|
<property key="garbage-collect-functions" value="true"/>
|
||||||
|
<property key="identifier-length" value="255"/>
|
||||||
|
<property key="local-generation" value="false"/>
|
||||||
|
<property key="operation-mode" value="free"/>
|
||||||
|
<property key="opt-xc8-compiler-strict_ansi" value="false"/>
|
||||||
|
<property key="optimization-assembler" value="true"/>
|
||||||
|
<property key="optimization-assembler-files" value="true"/>
|
||||||
|
<property key="optimization-debug" value="false"/>
|
||||||
|
<property key="optimization-invariant-enable" value="false"/>
|
||||||
|
<property key="optimization-invariant-value" value="16"/>
|
||||||
|
<property key="optimization-level" value="-O1"/>
|
||||||
|
<property key="optimization-speed" value="false"/>
|
||||||
|
<property key="optimization-stable-enable" value="false"/>
|
||||||
|
<property key="preprocess-assembler" value="true"/>
|
||||||
|
<property key="short-enums" value="true"/>
|
||||||
|
<property key="tentative-definitions" value=""/>
|
||||||
|
<property key="undefine-macros" value=""/>
|
||||||
|
<property key="use-cci" value="false"/>
|
||||||
|
<property key="use-iar" value="false"/>
|
||||||
|
<property key="verbose" value="false"/>
|
||||||
|
<property key="warning-level" value="-3"/>
|
||||||
|
<property key="what-to-do" value="ignore"/>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
<property key="additional-options-checksum" value=""/>
|
||||||
|
<property key="additional-options-code-offset" value=""/>
|
||||||
|
<property key="additional-options-command-line" value=""/>
|
||||||
|
<property key="additional-options-errata" value=""/>
|
||||||
|
<property key="additional-options-extend-address" value="false"/>
|
||||||
|
<property key="additional-options-trace-type" value=""/>
|
||||||
|
<property key="additional-options-use-response-files" value="false"/>
|
||||||
|
<property key="backup-reset-condition-flags" value="false"/>
|
||||||
|
<property key="calibrate-oscillator" value="false"/>
|
||||||
|
<property key="calibrate-oscillator-value" value="0x3400"/>
|
||||||
|
<property key="clear-bss" value="true"/>
|
||||||
|
<property key="code-model-external" value="wordwrite"/>
|
||||||
|
<property key="code-model-rom" value=""/>
|
||||||
|
<property key="create-html-files" value="false"/>
|
||||||
|
<property key="data-model-ram" value=""/>
|
||||||
|
<property key="data-model-size-of-double" value="24"/>
|
||||||
|
<property key="data-model-size-of-double-gcc" value="no-short-double"/>
|
||||||
|
<property key="data-model-size-of-float" value="24"/>
|
||||||
|
<property key="data-model-size-of-float-gcc" value="no-short-float"/>
|
||||||
|
<property key="display-class-usage" value="false"/>
|
||||||
|
<property key="display-hex-usage" value="false"/>
|
||||||
|
<property key="display-overall-usage" value="true"/>
|
||||||
|
<property key="display-psect-usage" value="false"/>
|
||||||
|
<property key="extra-lib-directories" value=""/>
|
||||||
|
<property key="fill-flash-options-addr" value=""/>
|
||||||
|
<property key="fill-flash-options-const" value=""/>
|
||||||
|
<property key="fill-flash-options-how" value="0"/>
|
||||||
|
<property key="fill-flash-options-inc-const" value="1"/>
|
||||||
|
<property key="fill-flash-options-increment" value=""/>
|
||||||
|
<property key="fill-flash-options-seq" value=""/>
|
||||||
|
<property key="fill-flash-options-what" value="0"/>
|
||||||
|
<property key="format-hex-file-for-download" value="false"/>
|
||||||
|
<property key="initialize-data" value="true"/>
|
||||||
|
<property key="input-libraries" value="libm"/>
|
||||||
|
<property key="keep-generated-startup.as" value="false"/>
|
||||||
|
<property key="link-in-c-library" value="true"/>
|
||||||
|
<property key="link-in-c-library-gcc" value=""/>
|
||||||
|
<property key="link-in-peripheral-library" value="false"/>
|
||||||
|
<property key="managed-stack" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-file" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-link_startup" value="false"/>
|
||||||
|
<property key="opt-xc8-linker-serial" value=""/>
|
||||||
|
<property key="program-the-device-with-default-config-words" value="true"/>
|
||||||
|
<property key="remove-unused-sections" value="true"/>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<Tool>
|
||||||
|
<property key="AutoSelectMemRanges" value="auto"/>
|
||||||
|
<property key="communication.activationmode" value="nohv"/>
|
||||||
|
<property key="communication.interface" value="updi"/>
|
||||||
|
<property key="communication.speed" value="0.500"/>
|
||||||
|
<property key="debugoptions.useswbreakpoints" value="false"/>
|
||||||
|
<property key="firmware.path"
|
||||||
|
value="Press to browse for a specific firmware version"/>
|
||||||
|
<property key="firmware.toolpack"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="firmware.update.action" value="firmware.update.use.latest"/>
|
||||||
|
<property key="freeze.timers" value="false"/>
|
||||||
|
<property key="memories.aux" value="false"/>
|
||||||
|
<property key="memories.bootflash" value="true"/>
|
||||||
|
<property key="memories.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.configurationmemory2" value="true"/>
|
||||||
|
<property key="memories.dataflash" value="true"/>
|
||||||
|
<property key="memories.eeprom" value="true"/>
|
||||||
|
<property key="memories.exclude.configurationmemory" value="true"/>
|
||||||
|
<property key="memories.flashdata" value="true"/>
|
||||||
|
<property key="memories.id" value="true"/>
|
||||||
|
<property key="memories.instruction.ram.ranges"
|
||||||
|
value="${memories.instruction.ram.ranges}"/>
|
||||||
|
<property key="memories.programmemory" value="true"/>
|
||||||
|
<property key="memories.programmemory.ranges" value="0-5fff"/>
|
||||||
|
<property key="memories.rww" value="true"/>
|
||||||
|
<property key="poweroptions.powerenable" value="false"/>
|
||||||
|
<property key="programoptions.eraseb4program" value="true"/>
|
||||||
|
<property key="programoptions.preservedataflash" value="false"/>
|
||||||
|
<property key="programoptions.preservedataflash.ranges"
|
||||||
|
value="${memories.dataflash.default}"/>
|
||||||
|
<property key="programoptions.preserveeeprom" value="false"/>
|
||||||
|
<property key="programoptions.preserveeeprom.ranges" value="1400-14ff"/>
|
||||||
|
<property key="programoptions.preserveprogram.ranges" value=""/>
|
||||||
|
<property key="programoptions.preserveprogramrange" value="false"/>
|
||||||
|
<property key="programoptions.preserveuserid" value="false"/>
|
||||||
|
<property key="programoptions.programuserotp" value="false"/>
|
||||||
|
<property key="toolpack.updateoptions"
|
||||||
|
value="toolpack.updateoptions.uselatestoolpack"/>
|
||||||
|
<property key="toolpack.updateoptions.packversion"
|
||||||
|
value="Press to select which tool pack to use"/>
|
||||||
|
<property key="voltagevalue" value=""/>
|
||||||
|
</Tool>
|
||||||
|
<XC8-CO>
|
||||||
|
<property key="coverage-enable" value=""/>
|
||||||
|
<property key="stack-guidance" value="false"/>
|
||||||
|
</XC8-CO>
|
||||||
|
<XC8-config-global>
|
||||||
|
<property key="advanced-elf" value="true"/>
|
||||||
|
<property key="gcc-opt-driver-new" value="true"/>
|
||||||
|
<property key="gcc-opt-std" value="-std=c99"/>
|
||||||
|
<property key="gcc-output-file-format" value="dwarf-3"/>
|
||||||
|
<property key="omit-pack-options" value="false"/>
|
||||||
|
<property key="omit-pack-options-new" value="1"/>
|
||||||
|
<property key="output-file-format" value="-mcof,+elf"/>
|
||||||
|
<property key="stack-size-high" value="auto"/>
|
||||||
|
<property key="stack-size-low" value="auto"/>
|
||||||
|
<property key="stack-size-main" value="auto"/>
|
||||||
|
<property key="stack-type" value="compiled"/>
|
||||||
|
<property key="user-pack-device-support" value=""/>
|
||||||
|
<property key="wpo-lto" value="false"/>
|
||||||
|
</XC8-config-global>
|
||||||
|
</conf>
|
||||||
|
</confs>
|
||||||
|
</configurationDescriptor>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>com.microchip.mplab.nbide.embedded.makeproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/make-project/1">
|
||||||
|
<name>birdptz</name>
|
||||||
|
<creation-uuid>e85c39d7-f632-41a5-8f48-d9660cba8332</creation-uuid>
|
||||||
|
<make-project-type>0</make-project-type>
|
||||||
|
<c-extensions>c</c-extensions>
|
||||||
|
<cpp-extensions/>
|
||||||
|
<header-extensions>h</header-extensions>
|
||||||
|
<asminc-extensions/>
|
||||||
|
<sourceEncoding>ISO-8859-1</sourceEncoding>
|
||||||
|
<make-dep-projects/>
|
||||||
|
<sourceRootList>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/src</sourceRootElem>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/include</sourceRootElem>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/examples</sourceRootElem>
|
||||||
|
</sourceRootList>
|
||||||
|
<confList>
|
||||||
|
<confElem>
|
||||||
|
<name>default</name>
|
||||||
|
<type>2</type>
|
||||||
|
</confElem>
|
||||||
|
</confList>
|
||||||
|
<formatting>
|
||||||
|
<project-formatting-style>false</project-formatting-style>
|
||||||
|
</formatting>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
||||||
31
nbproject/project.xml
Normal file
31
nbproject/project.xml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>com.microchip.mplab.nbide.embedded.makeproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/make-project/1">
|
||||||
|
<name>birdptz</name>
|
||||||
|
<creation-uuid>e85c39d7-f632-41a5-8f48-d9660cba8332</creation-uuid>
|
||||||
|
<make-project-type>0</make-project-type>
|
||||||
|
<c-extensions>c</c-extensions>
|
||||||
|
<cpp-extensions/>
|
||||||
|
<header-extensions>h</header-extensions>
|
||||||
|
<asminc-extensions/>
|
||||||
|
<sourceEncoding>ISO-8859-1</sourceEncoding>
|
||||||
|
<make-dep-projects/>
|
||||||
|
<sourceRootList>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/src</sourceRootElem>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/include</sourceRootElem>
|
||||||
|
<sourceRootElem>../camera_ptz.X/mcc_generated_files/examples</sourceRootElem>
|
||||||
|
</sourceRootList>
|
||||||
|
<confList>
|
||||||
|
<confElem>
|
||||||
|
<name>default</name>
|
||||||
|
<type>2</type>
|
||||||
|
</confElem>
|
||||||
|
</confList>
|
||||||
|
<formatting>
|
||||||
|
<project-formatting-style>false</project-formatting-style>
|
||||||
|
</formatting>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
||||||
706
twi0_master.c
Normal file
706
twi0_master.c
Normal file
@@ -0,0 +1,706 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "../include/twi0_master.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
// I2C STATES
|
||||||
|
typedef enum {
|
||||||
|
I2C0_IDLE = 0,
|
||||||
|
I2C0_SEND_ADR_READ,
|
||||||
|
I2C0_SEND_ADR_WRITE,
|
||||||
|
I2C0_TX,
|
||||||
|
I2C0_RX,
|
||||||
|
I2C0_TX_EMPTY,
|
||||||
|
I2C0_SEND_RESTART_READ,
|
||||||
|
I2C0_SEND_RESTART_WRITE,
|
||||||
|
I2C0_SEND_RESTART,
|
||||||
|
I2C0_SEND_STOP,
|
||||||
|
I2C0_RX_DO_ACK,
|
||||||
|
I2C0_TX_DO_ACK,
|
||||||
|
I2C0_RX_DO_RX_NACK_STOP,
|
||||||
|
I2C0_RX_DO_NACK_RESTART,
|
||||||
|
I2C0_RESET,
|
||||||
|
I2C0_ADDRESS_NACK,
|
||||||
|
I2C0_BUS_COLLISION,
|
||||||
|
I2C0_BUS_ERROR
|
||||||
|
} twi0_fsm_states_t;
|
||||||
|
|
||||||
|
// I2C Event Callback List
|
||||||
|
typedef enum {
|
||||||
|
I2C0_DATA_COMPLETE = 0,
|
||||||
|
I2C0_WRITE_COLLISION,
|
||||||
|
I2C0_ADDRESSNACK,
|
||||||
|
I2C0_DATA_NACK,
|
||||||
|
I2C0_TIMEOUT,
|
||||||
|
I2C0_NULL
|
||||||
|
} I2C0_callbackIndex_t;
|
||||||
|
|
||||||
|
// I2C Status Structure
|
||||||
|
typedef struct {
|
||||||
|
twi0_callback_t callbackTable[6];
|
||||||
|
void * callbackPayload[6];
|
||||||
|
uint16_t timeout;
|
||||||
|
uint16_t timeout_value;
|
||||||
|
twi0_address_t address;
|
||||||
|
uint8_t * data_ptr;
|
||||||
|
size_t data_length;
|
||||||
|
twi0_fsm_states_t state;
|
||||||
|
twi0_error_t error;
|
||||||
|
unsigned addressNACKCheck : 1;
|
||||||
|
unsigned busy : 1;
|
||||||
|
unsigned inUse : 1;
|
||||||
|
unsigned bufferFree : 1;
|
||||||
|
/*if timeoutDriverEnabled
|
||||||
|
timerStruct_t timeout;
|
||||||
|
*/
|
||||||
|
} I2C0_status_t;
|
||||||
|
I2C0_status_t I2C0_status = {0};
|
||||||
|
typedef twi0_fsm_states_t(stateHandlerFunction)(void);
|
||||||
|
|
||||||
|
/* I2C Interfaces */
|
||||||
|
void I2C0_Poller(void);
|
||||||
|
|
||||||
|
/* I2C Internal API's */
|
||||||
|
/* Master */
|
||||||
|
void I2C0_MasterOpen(void);
|
||||||
|
void I2C0_MasterClose(void);
|
||||||
|
char I2C0_MasterGetRxData(void);
|
||||||
|
void I2C0_MasterTxData(char d);
|
||||||
|
void I2C0_MasterTxAddr(char d);
|
||||||
|
void I2C0_MasterResetBus(void);
|
||||||
|
void I2C0_MasterIsRxOrTx(void);
|
||||||
|
void I2C0_MasterStop(void);
|
||||||
|
bool I2C0_MasterIsNack(void);
|
||||||
|
void I2C0_MasterSendAck(void);
|
||||||
|
void I2C0_MasterSendNack(void);
|
||||||
|
void I2C0_MasterClearBusCollision(void);
|
||||||
|
bool I2C0_MasterBusErrorOverride();
|
||||||
|
bool I2C0_MasterArbitrationlostOverride(void);
|
||||||
|
void I2C0_MasterEnableIrq(void);
|
||||||
|
bool I2C0_MasterIsIrqEnabled(void);
|
||||||
|
void I2C0_MasterDisableIrq(void);
|
||||||
|
void I2C0_MasterClearIrq(void);
|
||||||
|
void I2C0_MasterWaitForEvent(void);
|
||||||
|
static void I2C0_set_callback(I2C0_callbackIndex_t idx, twi0_callback_t cb, void *funPtr);
|
||||||
|
static twi0_operations_t I2C0_RETURN_STOP(void *funPtr);
|
||||||
|
static twi0_operations_t I2C0_RETURN_RESET(void *funPtr);
|
||||||
|
static void I2C0_MasterIsr(void);
|
||||||
|
|
||||||
|
/* Helper Functions */
|
||||||
|
static twi0_fsm_states_t I2C0_DO_IDLE(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_ADR_READ(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_ADR_WRITE(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX_EMPTY(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART_READ(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART_WRITE(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_STOP(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_ACK(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX_ACK(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_NACK_STOP(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_NACK_RESTART(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RESET(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_ADDRESS_NACK(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_BUS_COLLISION(void);
|
||||||
|
static twi0_fsm_states_t I2C0_DO_BUS_ERROR(void);
|
||||||
|
|
||||||
|
typedef twi0_fsm_states_t(stateHandlerFunction)(void);
|
||||||
|
stateHandlerFunction *I2C0_fsmStateTable[] = {
|
||||||
|
I2C0_DO_IDLE, // I2C_IDLE
|
||||||
|
I2C0_DO_SEND_ADR_READ, // I2C_SEND_ADR_READ
|
||||||
|
I2C0_DO_SEND_ADR_WRITE, // I2C_SEND_ADR_WRITE
|
||||||
|
I2C0_DO_TX, // I2C_TX
|
||||||
|
I2C0_DO_RX, // I2C_RX
|
||||||
|
I2C0_DO_TX_EMPTY, // I2C_TX_EMPTY
|
||||||
|
I2C0_DO_SEND_RESTART_READ, // I2C_SEND_RESTART_READ
|
||||||
|
I2C0_DO_SEND_RESTART_WRITE, // I2C_SEND_RESTART_WRITE
|
||||||
|
I2C0_DO_SEND_RESTART, // I2C_SEND_RESTART
|
||||||
|
I2C0_DO_SEND_STOP, // I2C_SEND_STOP
|
||||||
|
I2C0_DO_RX_ACK, // I2C_RX_DO_ACK
|
||||||
|
I2C0_DO_TX_ACK, // I2C_TX_DO_ACK
|
||||||
|
I2C0_DO_RX_NACK_STOP, // I2C_RX_DO_NACK_STOP
|
||||||
|
I2C0_DO_RX_NACK_RESTART, // I2C_RX_DO_NACK_RESTART
|
||||||
|
I2C0_DO_RESET, // I2C_RESET
|
||||||
|
I2C0_DO_ADDRESS_NACK, // I2C_ADDRESS_NACK
|
||||||
|
I2C0_DO_BUS_COLLISION, // I2C_BUS_COLLISION
|
||||||
|
I2C0_DO_BUS_ERROR // I2C_BUS_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
void I2C0_SetDataCompleteCallback(twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
I2C0_set_callback(I2C0_DATA_COMPLETE, cb, funPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetWriteCollisionCallback(twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
I2C0_set_callback(I2C0_WRITE_COLLISION, cb, funPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetAddressNackCallback(twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
I2C0_set_callback(I2C0_ADDRESSNACK, cb, funPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetDataNackCallback(twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
I2C0_set_callback(I2C0_DATA_NACK, cb, funPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetTimeoutCallback(twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
I2C0_set_callback(I2C0_TIMEOUT, cb, funPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t I2C0_Initialize()
|
||||||
|
{
|
||||||
|
//SDASETUP 8CYC; SDAHOLD 50NS; FMPEN disabled;
|
||||||
|
TWI0.CTRLA = 0x14;
|
||||||
|
|
||||||
|
//Debug Run
|
||||||
|
TWI0.DBGCTRL = 0x00;
|
||||||
|
|
||||||
|
//Master Baud Rate Control
|
||||||
|
TWI0.MBAUD = (uint8_t)TWI0_BAUD(100000, 0);
|
||||||
|
|
||||||
|
//RIEN disabled; WIEN disabled; QCEN disabled; TIMEOUT DISABLED; SMEN disabled; ENABLE enabled;
|
||||||
|
TWI0.MCTRLA = 0x01;
|
||||||
|
|
||||||
|
//RIF disabled; WIF disabled; CLKHOLD disabled; ARBLOST disabled; BUSERR disabled; BUSSTATE UNKNOWN;
|
||||||
|
TWI0.MSTATUS = 0x00;
|
||||||
|
|
||||||
|
//Master Address
|
||||||
|
TWI0.MADDR = 0x00;
|
||||||
|
|
||||||
|
//FLUSH disabled; ACKACT ACK; MCMD NOACT;
|
||||||
|
TWI0.MCTRLB = 0x00;
|
||||||
|
|
||||||
|
//Master Data
|
||||||
|
TWI0.MDATA = 0x00;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// when you call open, you supply a device address.
|
||||||
|
// if you get the bus, the function returns true
|
||||||
|
twi0_error_t I2C0_Open(twi0_address_t address)
|
||||||
|
{
|
||||||
|
twi0_error_t ret = I2C0_BUSY;
|
||||||
|
|
||||||
|
if (!I2C0_status.inUse) {
|
||||||
|
I2C0_status.address = address;
|
||||||
|
I2C0_status.busy = 0;
|
||||||
|
I2C0_status.inUse = 1;
|
||||||
|
I2C0_status.addressNACKCheck = 0;
|
||||||
|
I2C0_status.state = I2C0_RESET;
|
||||||
|
I2C0_status.timeout_value = 500; // MCC should determine a reasonable starting value here.
|
||||||
|
I2C0_status.bufferFree = 1;
|
||||||
|
|
||||||
|
// set all the call backs to a default of sending stop
|
||||||
|
I2C0_status.callbackTable[I2C0_DATA_COMPLETE] = I2C0_RETURN_STOP;
|
||||||
|
I2C0_status.callbackPayload[I2C0_DATA_COMPLETE] = NULL;
|
||||||
|
I2C0_status.callbackTable[I2C0_WRITE_COLLISION] = I2C0_RETURN_STOP;
|
||||||
|
I2C0_status.callbackPayload[I2C0_WRITE_COLLISION] = NULL;
|
||||||
|
I2C0_status.callbackTable[I2C0_ADDRESSNACK] = I2C0_RETURN_STOP;
|
||||||
|
I2C0_status.callbackPayload[I2C0_ADDRESSNACK] = NULL;
|
||||||
|
I2C0_status.callbackTable[I2C0_DATA_NACK] = I2C0_RETURN_STOP;
|
||||||
|
I2C0_status.callbackPayload[I2C0_DATA_NACK] = NULL;
|
||||||
|
I2C0_status.callbackTable[I2C0_TIMEOUT] = I2C0_RETURN_RESET;
|
||||||
|
I2C0_status.callbackPayload[I2C0_TIMEOUT] = NULL;
|
||||||
|
|
||||||
|
I2C0_MasterResetBus();
|
||||||
|
// Reset module
|
||||||
|
I2C0_MasterClearIrq();
|
||||||
|
|
||||||
|
ret = I2C0_NOERR;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetAddress(twi0_address_t address)
|
||||||
|
{
|
||||||
|
I2C0_status.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
// close the bus if it is not busy
|
||||||
|
twi0_error_t I2C0_Close(void)
|
||||||
|
{
|
||||||
|
twi0_error_t ret = I2C0_BUSY;
|
||||||
|
// Bus is in error state, reset I2C hardware and report error
|
||||||
|
if (I2C0_MasterBusErrorOverride()) {
|
||||||
|
I2C0_status.busy = false;
|
||||||
|
I2C0_status.error = I2C0_FAIL;
|
||||||
|
}
|
||||||
|
if (!I2C0_status.busy) {
|
||||||
|
I2C0_status.inUse = 0;
|
||||||
|
// close it down
|
||||||
|
I2C0_status.address = 0xff; // 8-bit address is invalid so this is FREE
|
||||||
|
I2C0_MasterClearIrq();
|
||||||
|
I2C0_MasterDisableIrq();
|
||||||
|
ret = I2C0_status.error;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetTimeout(uint8_t to)
|
||||||
|
{
|
||||||
|
I2C0_MasterDisableIrq();
|
||||||
|
I2C0_status.timeout_value = to;
|
||||||
|
I2C0_MasterEnableIrq();
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_SetBuffer(void *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
if (I2C0_status.bufferFree) {
|
||||||
|
I2C0_status.data_ptr = buffer;
|
||||||
|
I2C0_status.data_length = bufferSize;
|
||||||
|
I2C0_status.bufferFree = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
twi0_error_t I2C0_MasterOperation(bool read)
|
||||||
|
{
|
||||||
|
twi0_error_t ret = I2C0_BUSY;
|
||||||
|
if (!I2C0_status.busy) {
|
||||||
|
I2C0_status.busy = true;
|
||||||
|
ret = I2C0_NOERR;
|
||||||
|
|
||||||
|
if (read) {
|
||||||
|
I2C0_status.state = I2C0_SEND_ADR_READ;
|
||||||
|
} else {
|
||||||
|
I2C0_status.state = I2C0_SEND_ADR_WRITE;
|
||||||
|
}
|
||||||
|
I2C0_MasterIsr();
|
||||||
|
|
||||||
|
I2C0_Poller();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
twi0_error_t I2C0_MasterRead(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
return I2C0_MasterOperation(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
twi0_error_t I2C0_MasterWrite(void)
|
||||||
|
{
|
||||||
|
return I2C0_MasterOperation(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Helper Functions */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
void I2C0_Poller(void)
|
||||||
|
{
|
||||||
|
while (I2C0_status.busy)
|
||||||
|
{
|
||||||
|
I2C0_MasterWaitForEvent();
|
||||||
|
I2C0_MasterIsr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RESET(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterResetBus();
|
||||||
|
I2C0_status.busy = false; // Bus Free
|
||||||
|
I2C0_status.error = I2C0_NOERR;
|
||||||
|
return I2C0_RESET; // park the FSM on reset
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_IDLE(void)
|
||||||
|
{
|
||||||
|
I2C0_status.busy = false; // Bus Free
|
||||||
|
I2C0_status.error = I2C0_NOERR;
|
||||||
|
return I2C0_IDLE; // park the FSM on IDLE
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART_READ(void)
|
||||||
|
{
|
||||||
|
return I2C0_DO_SEND_ADR_READ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART_WRITE(void)
|
||||||
|
{
|
||||||
|
return I2C0_DO_SEND_ADR_WRITE();
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_RESTART(void)
|
||||||
|
{
|
||||||
|
return I2C0_DO_SEND_ADR_READ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_STOP(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterStop();
|
||||||
|
return I2C0_DO_IDLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: probably need 2 addressNACK's one from read and one from write.
|
||||||
|
// the do NACK before RESTART or STOP is a special case that a new state simplifies.
|
||||||
|
static twi0_fsm_states_t I2C0_DO_ADDRESS_NACK(void)
|
||||||
|
{
|
||||||
|
I2C0_status.addressNACKCheck = 0;
|
||||||
|
I2C0_status.error = I2C0_FAIL;
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_ADDRESSNACK](I2C0_status.callbackPayload[I2C0_ADDRESSNACK])) {
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_SEND_RESTART_READ();
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
return I2C0_DO_SEND_RESTART_WRITE();
|
||||||
|
default:
|
||||||
|
return I2C0_DO_SEND_STOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_ADR_READ(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
I2C0_status.addressNACKCheck = 1;
|
||||||
|
I2C0_MasterTxAddr(I2C0_status.address << 1 | 1);
|
||||||
|
return I2C0_RX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_SEND_ADR_WRITE(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
I2C0_status.addressNACKCheck = 1;
|
||||||
|
I2C0_MasterTxAddr(I2C0_status.address << 1);
|
||||||
|
return I2C0_TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_ACK(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterSendAck();
|
||||||
|
return I2C0_RX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX_ACK(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterSendAck();
|
||||||
|
return I2C0_TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_NACK_STOP(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterSendNack();
|
||||||
|
I2C0_MasterStop();
|
||||||
|
return I2C0_DO_IDLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX_NACK_RESTART(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterSendNack();
|
||||||
|
return I2C0_SEND_RESTART;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX(void)
|
||||||
|
{
|
||||||
|
if (I2C0_MasterIsNack()) // Slave replied with NACK
|
||||||
|
{
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_DATA_NACK](I2C0_status.callbackPayload[I2C0_DATA_NACK])) {
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_SEND_RESTART_READ();
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
return I2C0_DO_SEND_RESTART_WRITE();
|
||||||
|
default:
|
||||||
|
case I2C0_CONTINUE:
|
||||||
|
case I2C0_STOP:
|
||||||
|
return I2C0_DO_SEND_STOP();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
I2C0_status.addressNACKCheck = 0;
|
||||||
|
I2C0_MasterTxData(*I2C0_status.data_ptr++);
|
||||||
|
return (--I2C0_status.data_length) ? I2C0_TX : I2C0_TX_EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_RX(void)
|
||||||
|
{
|
||||||
|
I2C0_status.addressNACKCheck = 0;
|
||||||
|
|
||||||
|
if (I2C0_status.data_length == 1)
|
||||||
|
I2C0_MasterSendNack(); // Next byte will be last to be received, setup NACK
|
||||||
|
else
|
||||||
|
I2C0_MasterSendAck(); // More bytes to receive, setup ACK
|
||||||
|
|
||||||
|
if (--I2C0_status.data_length) {
|
||||||
|
*I2C0_status.data_ptr = I2C0_MasterGetRxData();
|
||||||
|
I2C0_status.data_ptr++;
|
||||||
|
I2C0_MasterIsRxOrTx();
|
||||||
|
return I2C0_RX;
|
||||||
|
} else {
|
||||||
|
*I2C0_status.data_ptr = I2C0_MasterGetRxData();
|
||||||
|
I2C0_status.data_ptr++;
|
||||||
|
I2C0_status.bufferFree = true;
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_DATA_COMPLETE](I2C0_status.callbackPayload[I2C0_DATA_COMPLETE])) {
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_RX_NACK_RESTART();
|
||||||
|
default:
|
||||||
|
case I2C0_CONTINUE:
|
||||||
|
case I2C0_STOP:
|
||||||
|
return I2C0_DO_RX_NACK_STOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_TX_EMPTY(void)
|
||||||
|
{
|
||||||
|
if (I2C0_MasterIsNack()) // Slave replied with NACK
|
||||||
|
{
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_DATA_NACK](I2C0_status.callbackPayload[I2C0_DATA_NACK])) {
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_SEND_RESTART_READ();
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
return I2C0_DO_SEND_RESTART_WRITE();
|
||||||
|
default:
|
||||||
|
case I2C0_CONTINUE:
|
||||||
|
case I2C0_STOP:
|
||||||
|
return I2C0_DO_SEND_STOP();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
I2C0_status.bufferFree = true;
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_DATA_COMPLETE](I2C0_status.callbackPayload[I2C0_DATA_COMPLETE])) {
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_SEND_RESTART_READ();
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
return I2C0_DO_SEND_RESTART_WRITE();
|
||||||
|
case I2C0_CONTINUE:
|
||||||
|
return I2C0_DO_TX();
|
||||||
|
default:
|
||||||
|
case I2C0_STOP:
|
||||||
|
return I2C0_DO_SEND_STOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_BUS_COLLISION(void)
|
||||||
|
{
|
||||||
|
// Clear bus collision status flag
|
||||||
|
I2C0_MasterClearBusCollision();
|
||||||
|
|
||||||
|
I2C0_status.error = I2C0_FAIL;
|
||||||
|
switch (I2C0_status.callbackTable[I2C0_WRITE_COLLISION](I2C0_status.callbackPayload[I2C0_WRITE_COLLISION])) {
|
||||||
|
case I2C0_RESTART_READ:
|
||||||
|
return I2C0_DO_SEND_RESTART_READ();
|
||||||
|
case I2C0_RESTART_WRITE:
|
||||||
|
return I2C0_DO_SEND_RESTART_WRITE();
|
||||||
|
default:
|
||||||
|
return I2C0_DO_RESET();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_fsm_states_t I2C0_DO_BUS_ERROR(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterResetBus();
|
||||||
|
I2C0_status.busy = false;
|
||||||
|
I2C0_status.error = I2C0_FAIL;
|
||||||
|
return I2C0_RESET; // park the FSM on reset
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void I2C0_MasterIsr(void)
|
||||||
|
{
|
||||||
|
I2C0_MasterClearIrq();
|
||||||
|
|
||||||
|
// NOTE: We are ignoring the Write Collision flag.
|
||||||
|
|
||||||
|
// Address phase received NACK from slave, override next state
|
||||||
|
if (I2C0_status.addressNACKCheck && I2C0_MasterIsNack()) {
|
||||||
|
I2C0_status.state = I2C0_ADDRESS_NACK; // State Override
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bus arbitration lost to another master, override next state
|
||||||
|
if (I2C0_MasterArbitrationlostOverride()) {
|
||||||
|
I2C0_status.state = I2C0_BUS_COLLISION; // State Override
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bus error, override next state
|
||||||
|
if (I2C0_MasterBusErrorOverride()) {
|
||||||
|
I2C0_status.state = I2C0_BUS_ERROR; // State Override
|
||||||
|
}
|
||||||
|
|
||||||
|
I2C0_status.state = I2C0_fsmStateTable[I2C0_status.state]();
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Helper Functions */
|
||||||
|
/************************************************************************/
|
||||||
|
static twi0_operations_t I2C0_RETURN_STOP(void *p)
|
||||||
|
{
|
||||||
|
return I2C0_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static twi0_operations_t I2C0_RETURN_RESET(void *p)
|
||||||
|
{
|
||||||
|
return I2C0_RESET_LINK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void I2C0_set_callback(I2C0_callbackIndex_t idx, twi0_callback_t cb, void *funPtr)
|
||||||
|
{
|
||||||
|
if (cb) {
|
||||||
|
I2C0_status.callbackTable[idx] = cb;
|
||||||
|
I2C0_status.callbackPayload[idx] = funPtr;
|
||||||
|
} else {
|
||||||
|
I2C0_status.callbackTable[idx] = I2C0_RETURN_STOP;
|
||||||
|
I2C0_status.callbackPayload[idx] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Master Definitions */
|
||||||
|
|
||||||
|
void I2C0_MasterOpen(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLA = 1 << TWI_ENABLE_bp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterClose(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLA = 0 << TWI_ENABLE_bp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interrupt Control */
|
||||||
|
void I2C0_MasterEnableIrq(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLA |= (TWI_RIEN_bm | TWI_WIEN_bm);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool I2C0_MasterIsIrqEnabled(void)
|
||||||
|
{
|
||||||
|
return ((TWI0.MCTRLA & TWI_WIEN_bm) && (TWI0.MCTRLA & TWI_RIEN_bm));
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterDisableIrq(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLA &= ~(TWI_RIEN_bm | TWI_WIEN_bm);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterClearIrq(void)
|
||||||
|
{
|
||||||
|
TWI0.MSTATUS |= (TWI_RIF_bm | TWI_WIF_bm);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool I2C0_MasterBusErrorOverride(void)
|
||||||
|
{
|
||||||
|
return TWI0.MSTATUS & TWI_BUSERR_bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool I2C0_MasterArbitrationlostOverride(void)
|
||||||
|
{
|
||||||
|
return TWI0.MSTATUS & TWI_ARBLOST_bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterResetBus(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLB |= TWI_FLUSH_bm;
|
||||||
|
TWI0.MSTATUS |= TWI_BUSSTATE_IDLE_gc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterIsRxOrTx(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLB |= TWI_MCMD_RECVTRANS_gc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterClearBusCollision(void)
|
||||||
|
{
|
||||||
|
TWI0.MSTATUS |= TWI_ARBLOST_bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterWaitForEvent(void)
|
||||||
|
{
|
||||||
|
while (!(TWI0.MSTATUS & TWI_RIF_bm) && !(TWI0.MSTATUS & TWI_WIF_bm))
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterStop(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLB |= TWI_MCMD_STOP_gc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool I2C0_MasterIsNack(void)
|
||||||
|
{
|
||||||
|
return TWI0.MSTATUS & TWI_RXACK_bm;
|
||||||
|
}
|
||||||
|
|
||||||
|
char I2C0_MasterGetRxData(void)
|
||||||
|
{
|
||||||
|
return TWI0.MDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterTxData(char d)
|
||||||
|
{
|
||||||
|
TWI0.MDATA = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterTxAddr(char d)
|
||||||
|
{
|
||||||
|
TWI0.MADDR = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterSendAck(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLB &= ~(1 << TWI_ACKACT_bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_MasterSendNack(void)
|
||||||
|
{
|
||||||
|
TWI0.MCTRLB |= TWI_ACKACT_NACK_gc;
|
||||||
|
}
|
||||||
|
|
||||||
|
twi0_operations_t I2C0_SetReturnStopCallback(void *funPtr)
|
||||||
|
{
|
||||||
|
return I2C0_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
twi0_operations_t I2C0_SetReturnResetCallback(void *funPtr)
|
||||||
|
{
|
||||||
|
return I2C0_RESET_LINK;
|
||||||
|
}
|
||||||
|
|
||||||
|
twi0_operations_t I2C0_SetRestartWriteCallback(void *funPtr)
|
||||||
|
{
|
||||||
|
return I2C0_RESTART_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
twi0_operations_t I2C0_SetRestartReadCallback(void *funPtr)
|
||||||
|
{
|
||||||
|
return I2C0_RESTART_READ;
|
||||||
|
}
|
||||||
220
twi0_master.h
Normal file
220
twi0_master.h
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TWI0_MASTER_H
|
||||||
|
#define TWI0_MASTER_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TWI0_BAUD(F_SCL, T_RISE) \
|
||||||
|
((((((float)10000000 / (float)F_SCL)) - 10 - ((float)10000000 * T_RISE / 1000000))) / 2)
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
I2C0_NOERR, // The message was sent.
|
||||||
|
I2C0_BUSY, // Message was NOT sent, bus was busy.
|
||||||
|
I2C0_FAIL // Message was NOT sent, bus failure
|
||||||
|
// If you are interested in the failure reason,
|
||||||
|
// Sit on the event call-backs.
|
||||||
|
} twi0_error_t;
|
||||||
|
|
||||||
|
typedef enum { I2C0_STOP = 1, I2C0_RESTART_READ, I2C0_RESTART_WRITE, I2C0_CONTINUE, I2C0_RESET_LINK } twi0_operations_t;
|
||||||
|
|
||||||
|
typedef twi0_operations_t (*twi0_callback_t)(void *funPtr);
|
||||||
|
|
||||||
|
typedef uint8_t twi0_address_t;
|
||||||
|
typedef twi0_address_t i2c_address_t;
|
||||||
|
// common callback responses
|
||||||
|
twi0_operations_t I2C0_SetReturnStopCallback(void *funPtr);
|
||||||
|
twi0_operations_t I2C0_SetReturnResetCallback(void *funPtr);
|
||||||
|
twi0_operations_t I2C0_SetRestartWriteCallback(void *funPtr);
|
||||||
|
twi0_operations_t I2C0_SetRestartReadCallback(void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize I2C interface
|
||||||
|
* If module is configured to disabled state, the clock to the I2C is disabled
|
||||||
|
* if this is supported by the device's clock system.
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval 0 the init was successful
|
||||||
|
* \retval 1 the init was not successful
|
||||||
|
*/
|
||||||
|
uint8_t I2C0_Initialize(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Open the I2C for communication
|
||||||
|
*
|
||||||
|
* \param[in] address The slave address to use in the transfer
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval I2C_NOERR The I2C open was successful
|
||||||
|
* \retval I2C_BUSY The I2C open failed because the interface is busy
|
||||||
|
* \retval I2C_FAIL The I2C open failed with an error
|
||||||
|
*/
|
||||||
|
twi0_error_t I2C0_Open(twi0_address_t address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Close the I2C interface
|
||||||
|
*
|
||||||
|
* \return Status of close operation.
|
||||||
|
* \retval I2C_NOERR The I2C open was successful
|
||||||
|
* \retval I2C_BUSY The I2C open failed because the interface is busy
|
||||||
|
* \retval I2C_FAIL The I2C open failed with an error
|
||||||
|
*/
|
||||||
|
twi0_error_t I2C0_Close(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Start an operation on an opened I2C interface
|
||||||
|
*
|
||||||
|
* \param[in] read Set to true for read, false for write
|
||||||
|
*
|
||||||
|
* \return Status of operation
|
||||||
|
* \retval I2C_NOERR The I2C open was successful
|
||||||
|
* \retval I2C_BUSY The I2C open failed because the interface is busy
|
||||||
|
* \retval I2C_FAIL The I2C open failed with an error
|
||||||
|
*/
|
||||||
|
twi0_error_t I2C0_MasterOperation(bool read);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Identical to I2C0_MasterOperation(false);
|
||||||
|
*/
|
||||||
|
|
||||||
|
twi0_error_t I2C0_MasterWrite(void); // to be depreciated
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Identical to I2C0_MasterOperation(true);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
twi0_error_t I2C0_MasterRead(void); // to be depreciated
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set timeout to be used for I2C operations. Uses the Timeout driver.
|
||||||
|
*
|
||||||
|
* \param[in] to Timeout in ticks
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetTimeout(uint8_t to);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Sets up the data buffer to use, and number of bytes to transfer
|
||||||
|
*
|
||||||
|
* \param[in] buffer Pointer to data buffer to use for read or write data
|
||||||
|
* \param[in] bufferSize Number of bytes to read or write from slave
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetBuffer(void *buffer, size_t bufferSize);
|
||||||
|
|
||||||
|
// Event Callback functions.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set callback to be called when all specifed data has been transferred.
|
||||||
|
*
|
||||||
|
* \param[in] cb Pointer to callback function
|
||||||
|
* \param[in] p Pointer to the callback function's parameters
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetDataCompleteCallback(twi0_callback_t cb, void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set callback to be called when there has been a bus collision and arbitration was lost.
|
||||||
|
*
|
||||||
|
* \param[in] cb Pointer to callback function
|
||||||
|
* \param[in] p Pointer to the callback function's parameters
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetWriteCollisionCallback(twi0_callback_t cb, void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set callback to be called when the transmitted address was NACK'ed.
|
||||||
|
*
|
||||||
|
* \param[in] cb Pointer to callback function
|
||||||
|
* \param[in] p Pointer to the callback function's parameters
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetAddressNackCallback(twi0_callback_t cb, void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set callback to be called when the transmitted data was NACK'ed.
|
||||||
|
*
|
||||||
|
* \param[in] cb Pointer to callback function
|
||||||
|
* \param[in] p Pointer to the callback function's parameters
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetDataNackCallback(twi0_callback_t cb, void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set callback to be called when there was a bus timeout.
|
||||||
|
*
|
||||||
|
* \param[in] cb Pointer to callback function
|
||||||
|
* \param[in] p Pointer to the callback function's parameters
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetTimeoutCallback(twi0_callback_t cb, void *funPtr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief In a polled implementation, call this function in a loop to execute the FSM
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_Poller(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set Address to be called when there was aa address reception.
|
||||||
|
*
|
||||||
|
* \param[in] address Loads the address of the master
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
void I2C0_SetAddress(twi0_address_t address);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* TWI0_MASTER_H */
|
||||||
173
twi0_master_example.c
Normal file
173
twi0_master_example.c
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
This file provides some basic blocking helper functions for common operations on the i2c API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/twi0_master.h"
|
||||||
|
#include "twi0_master_example.h"
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
static twi0_operations_t wr1RegCompleteHandler_example(void *ptr)
|
||||||
|
{
|
||||||
|
I2C0_SetBuffer(ptr,1);
|
||||||
|
I2C0_SetDataCompleteCallback(NULL,NULL);
|
||||||
|
return I2C0_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_example_write1ByteRegister(twi0_address_t address, uint8_t reg, uint8_t data)
|
||||||
|
{
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetDataCompleteCallback(wr1RegCompleteHandler_example,&data);
|
||||||
|
I2C0_SetBuffer(®,1);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_example_writeNBytes(twi0_address_t address, void* data, size_t len)
|
||||||
|
{
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetBuffer(data,len);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
static twi0_operations_t rd1RegCompleteHandler_example(void *ptr)
|
||||||
|
{
|
||||||
|
I2C0_SetBuffer(ptr,1);
|
||||||
|
I2C0_SetDataCompleteCallback(NULL,NULL);
|
||||||
|
return I2C0_RESTART_READ;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t I2C0_example_read1ByteRegister(twi0_address_t address, uint8_t reg)
|
||||||
|
{
|
||||||
|
uint8_t d2=42;
|
||||||
|
twi0_error_t e;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for(x = 2; x != 0; x--)
|
||||||
|
{
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetDataCompleteCallback(rd1RegCompleteHandler_example,&d2);
|
||||||
|
I2C0_SetBuffer(®,1);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == (e = I2C0_Close())); // sit here until finished.
|
||||||
|
if(e==I2C0_NOERR) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return d2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
static twi0_operations_t rd2RegCompleteHandler_example(void *ptr)
|
||||||
|
{
|
||||||
|
I2C0_SetBuffer(ptr,2);
|
||||||
|
I2C0_SetDataCompleteCallback(NULL,NULL);
|
||||||
|
return I2C0_RESTART_READ;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t I2C0_example_read2ByteRegister(twi0_address_t address, uint8_t reg)
|
||||||
|
{
|
||||||
|
// result is little endian
|
||||||
|
uint16_t result;
|
||||||
|
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetDataCompleteCallback(rd2RegCompleteHandler_example,&result);
|
||||||
|
I2C0_SetBuffer(®,1);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
|
||||||
|
return (result << 8 | result >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
static twi0_operations_t wr2RegCompleteHandler_example(void *ptr)
|
||||||
|
{
|
||||||
|
I2C0_SetBuffer(ptr,2);
|
||||||
|
I2C0_SetDataCompleteCallback(NULL,NULL);
|
||||||
|
return I2C0_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_example_write2ByteRegister(twi0_address_t address, uint8_t reg, uint16_t data)
|
||||||
|
{
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetDataCompleteCallback(wr2RegCompleteHandler_example,&data);
|
||||||
|
I2C0_SetBuffer(®,1);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *data;
|
||||||
|
}buf_t;
|
||||||
|
|
||||||
|
static twi0_operations_t rdBlkRegCompleteHandler_example(void *ptr)
|
||||||
|
{
|
||||||
|
I2C0_SetBuffer(((buf_t *)ptr)->data,((buf_t*)ptr)->len);
|
||||||
|
I2C0_SetDataCompleteCallback(NULL,NULL);
|
||||||
|
return I2C0_RESTART_READ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_example_readDataBlock(twi0_address_t address, uint8_t reg, void *data, size_t len)
|
||||||
|
{
|
||||||
|
// result is little endian
|
||||||
|
buf_t d;
|
||||||
|
d.data = data;
|
||||||
|
d.len = len;
|
||||||
|
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetDataCompleteCallback(rdBlkRegCompleteHandler_example,&d);
|
||||||
|
I2C0_SetBuffer(®,1);
|
||||||
|
I2C0_SetAddressNackCallback(I2C0_SetRestartWriteCallback,NULL); //NACK polling?
|
||||||
|
I2C0_MasterWrite();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2C0_example_readNBytes(twi0_address_t address, void *data, size_t len)
|
||||||
|
{
|
||||||
|
while(!I2C0_Open(address)); // sit here until we get the bus..
|
||||||
|
I2C0_SetBuffer(data,len);
|
||||||
|
I2C0_MasterRead();
|
||||||
|
while(I2C0_BUSY == I2C0_Close()); // sit here until finished.
|
||||||
|
}
|
||||||
50
twi0_master_example.h
Normal file
50
twi0_master_example.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
@Company
|
||||||
|
Microchip Technology Inc.
|
||||||
|
|
||||||
|
@Description
|
||||||
|
This Source file provides APIs.
|
||||||
|
Generation Information :
|
||||||
|
Driver Version : 1.0.0
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
|
||||||
|
Subject to your compliance with these terms, you may use Microchip software and any
|
||||||
|
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
|
||||||
|
license terms applicable to your use of third party software (including open source software) that
|
||||||
|
may accompany Microchip software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
||||||
|
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
|
||||||
|
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
||||||
|
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
||||||
|
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
|
||||||
|
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
|
||||||
|
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
|
||||||
|
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
|
||||||
|
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TWI0_MASTER_EXAMPLE_H
|
||||||
|
#define TWI0_MASTER_EXAMPLE_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "twi0_master.h"
|
||||||
|
|
||||||
|
uint8_t I2C0_example_read1ByteRegister(twi0_address_t address, uint8_t reg);
|
||||||
|
uint16_t I2C0_example_read2ByteRegister(twi0_address_t address, uint8_t reg);
|
||||||
|
void I2C0_example_write1ByteRegister(twi0_address_t address, uint8_t reg, uint8_t data);
|
||||||
|
void I2C0_example_write2ByteRegister(twi0_address_t address, uint8_t reg, uint16_t data);
|
||||||
|
|
||||||
|
void I2C0_example_writeNBytes(twi0_address_t address, void* data, size_t len);
|
||||||
|
void I2C0_example_readDataBlock(twi0_address_t address, uint8_t reg, void *data, size_t len);
|
||||||
|
void iI2C0_example_readNBytes(twi0_address_t address, void *data, size_t len);
|
||||||
|
|
||||||
|
#endif /* TWI0_MASTER_EXAMPLE_H */
|
||||||
Reference in New Issue
Block a user