diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..63ebf38 --- /dev/null +++ b/.clang-format @@ -0,0 +1,13 @@ +--- +BasedOnStyle: LLVM +ColumnLimit: 120 +IndentWidth: 4 +TabWidth: 4 +UseTab: ForIndentation +AlignEscapedNewlines: DontAlign +AllowShortFunctionsOnASingleLine: Empty +AlwaysBreakTemplateDeclarations: true +BreakBeforeBraces: Custom +BraceWrapping: + AfterFunction: true +... diff --git a/.gitignore b/.gitignore index 1c0bc70..9f584cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ .vs -*/Release -*/Debug +Release +Debug *.componentinfo.xml -*/avrdude.bat +*.elf +*.o +*.hex +*.srec +*.eeprom +*.lss +*.map diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7004e32 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "spi/spi"] + path = spi/spi + url = git@git.blackmark.me:avr/spi.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..80da57f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 BlackMark + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/spi.atsln b/spi.atsln new file mode 100644 index 0000000..8ab8c15 --- /dev/null +++ b/spi.atsln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Atmel Studio Solution File, Format Version 11.00 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{E66E83B9-2572-4076-B26E-6BE79FF3018A}") = "spi", "spi\spi.cppproj", "{DCE6C7E3-EE26-4D79-826B-08594B9AD897}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.ActiveCfg = Debug|AVR + {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.Build.0 = Debug|AVR + {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.ActiveCfg = Release|AVR + {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/spi.cpp b/spi.cpp deleted file mode 100644 index 16bf25f..0000000 --- a/spi.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "spi.h" - -////////////////////////////////////////////////////////////////////////// -InOutPin SPI::sm_cSCK; -InOutPin SPI::sm_cMISO; -InOutPin SPI::sm_cMOSI; -InOutPin SPI::sm_cSS; - -////////////////////////////////////////////////////////////////////////// -void SPI::setCPOL( bool bCPOL ) -{ - if( bCPOL ) - { - SPCR |= ( 1 << CPOL ); - } - else - { - SPCR &= ~( 1 << CPOL ); - } -} - -////////////////////////////////////////////////////////////////////////// -void SPI::setCPHA( bool bCPHA ) -{ - if( bCPHA ) - { - SPCR |= ( 1 << CPHA ); - } - else - { - SPCR &= ~( 1 << CPHA ); - } -} - -////////////////////////////////////////////////////////////////////////// -void SPI::init( ClockDiv enmClockDiv /* = ClockDiv::CLKDIV_128 */, Mode enmMode /* = Mode::MODE_0 */, bool bMaster /* = true */, bool bLSBFirst /* = false */, bool bMISOPullup /* = false */ ) -{ - sm_cSCK.setPin( sm_enmSCK ); - sm_cMISO.setPin( sm_enmMISO ); - sm_cMOSI.setPin( sm_enmMOSI ); - sm_cSS.setPin( sm_enmSS ); - - if( bMaster ) - { - sm_cSS.write( true ); - - sm_cSCK.setDirection( InOut::Dir::D_OUT, false ); - sm_cMISO.setDirection( InOut::Dir::D_IN, bMISOPullup ); - sm_cMOSI.setDirection( InOut::Dir::D_OUT, false ); - sm_cSS.setDirection( InOut::Dir::D_OUT, false ); - } - else - { - sm_cSCK.setDirection( InOut::Dir::D_IN, false ); - sm_cMISO.setDirection( InOut::Dir::D_OUT, false ); - sm_cMOSI.setDirection( InOut::Dir::D_IN, false ); - sm_cSS.setDirection( InOut::Dir::D_IN, true ); - } - - setClockDiv( enmClockDiv ); - setMode( enmMode ); - setMaster( bMaster ); - setBitOrder( bLSBFirst ); - - SPCR |= ( 1 << SPE ); -} - -////////////////////////////////////////////////////////////////////////// -void SPI::deinit() -{ - SPCR = 0; - - sm_cSCK.setDirection( InOut::Dir::D_IN, false ); - sm_cMISO.setDirection( InOut::Dir::D_IN, false ); - sm_cMOSI.setDirection( InOut::Dir::D_IN, false ); - sm_cSS.setDirection( InOut::Dir::D_IN, false ); -} - -////////////////////////////////////////////////////////////////////////// -void SPI::setClockDiv( ClockDiv enmClockDiv ) -{ - uint8_t ui8ClockDiv = static_cast( enmClockDiv ); - - if( ui8ClockDiv & 1 ) - { - SPCR |= ( 1 << SPR0 ); - } - else - { - SPCR &= ~( 1 << SPR0 ); - } - - if( ui8ClockDiv & ( 1 << 1 ) ) - { - SPCR |= ( 1 << SPR1 ); - } - else - { - SPCR &= ~( 1 << SPR1 ); - } - - if( ui8ClockDiv & ( 1 << 2 ) ) - { - SPSR |= ( 1 << SPI2X ); - } - else - { - SPSR &= ~( 1 << SPI2X ); - } -} - -////////////////////////////////////////////////////////////////////////// -void SPI::setMode( Mode enmMode ) -{ - if( enmMode == Mode::MODE_0 || enmMode == Mode::MODE_1 ) - { - setCPOL( false ); - } - else - { - setCPOL( true ); - } - - if( enmMode == Mode::MODE_0 || enmMode == Mode::MODE_2 ) - { - setCPHA( false ); - } - else - { - setCPHA( true ); - } -} - -////////////////////////////////////////////////////////////////////////// -void SPI::setMaster( bool bMaster ) -{ - if( bMaster ) - { - SPCR |= ( 1 << MSTR ); - } - else - { - SPCR &= ~( 1 << MSTR ); - } -} - -////////////////////////////////////////////////////////////////////////// -void SPI::setBitOrder( bool bLSBFirst ) -{ - if( bLSBFirst ) - { - SPCR |= ( 1 << DORD ); - } - else - { - SPCR &= ~( 1 << DORD ); - } -} - -////////////////////////////////////////////////////////////////////////// -uint8_t SPI::transfer( uint8_t ui8Data ) -{ - SPDR = ui8Data; - while( !( SPSR & ( 1 << SPIF ) ) ); - return SPDR; -} - -////////////////////////////////////////////////////////////////////////// -void SPI::select( bool bSelect ) -{ - sm_cSS.write( !bSelect ); -} \ No newline at end of file diff --git a/spi.h b/spi.h deleted file mode 100644 index 8bc9318..0000000 --- a/spi.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -* Copyright (c) by BlackMark 2016-2017 -* Date 17/09/2017 -* Version 1.4 -*/ - -#ifndef SPI_H -#define SPI_H - -#include -#include "../inout/inout.h" - -class SPI -{ -public: - enum class ClockDiv - { - CLKDIV_4 = 0, - CLKDIV_16 = 1, - CLKDIV_64 = 2, - CLKDIV_128 = 3, - - CLKDIV_2X_2 = 4, - CLKDIV_2X_8 = 5, - CLKDIV_2X_32 = 6, - CLKDIV_2X_64 = 7 - }; - - enum class Mode - { - MODE_0 = 0, - MODE_1 = 1, - MODE_2 = 2, - MODE_3 = 3 - }; - -private: - static void setCPOL( bool bCPOL ); - static void setCPHA( bool bCPHA ); - - static constexpr InOut::Pin sm_enmSCK = InOut::Pin::P_B5; - static constexpr InOut::Pin sm_enmMISO = InOut::Pin::P_B4; - static constexpr InOut::Pin sm_enmMOSI = InOut::Pin::P_B3; - static constexpr InOut::Pin sm_enmSS = InOut::Pin::P_B2; - - static InOutPin sm_cSCK; - static InOutPin sm_cMISO; - static InOutPin sm_cMOSI; - static InOutPin sm_cSS; - -public: - static void init( ClockDiv enmClockDiv = ClockDiv::CLKDIV_128, Mode enmMode = Mode::MODE_0, bool bMaster = true, bool bLSBFirst = false, bool bMISOPullup = false ); - static void deinit(); - static void setClockDiv( ClockDiv enmClockDiv ); - static void setMode( Mode enmMode ); - static void setMaster( bool bMaster ); - static void setBitOrder( bool bLSBFirst ); - - static uint8_t transfer( uint8_t ui8Data ); - - static void select( bool bSelect ); -}; - -#endif \ No newline at end of file diff --git a/spi/clock.hpp b/spi/clock.hpp new file mode 100644 index 0000000..94845e9 --- /dev/null +++ b/spi/clock.hpp @@ -0,0 +1,4 @@ +#pragma once + +#define F_CPU 16000000 +#include diff --git a/spi/main.cpp b/spi/main.cpp new file mode 100644 index 0000000..e153ef7 --- /dev/null +++ b/spi/main.cpp @@ -0,0 +1,10 @@ +#include "clock.hpp" + +void spiTest() {} + +int main() +{ + spiTest(); + + return 0; +} diff --git a/spi/spi b/spi/spi new file mode 160000 index 0000000..7a1761e --- /dev/null +++ b/spi/spi @@ -0,0 +1 @@ +Subproject commit 7a1761e054faf44d168557406873434fff47a5ac diff --git a/spi/spi.cppproj b/spi/spi.cppproj new file mode 100644 index 0000000..37950d3 --- /dev/null +++ b/spi/spi.cppproj @@ -0,0 +1,196 @@ + + + + 2.0 + 7.0 + com.Atmel.AVRGCC8.CPP + dce6c7e3-ee26-4d79-826b-08594b9ad897 + ATmega328P + none + Executable + CPP + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + spi + spi + spi + avr-g++-9.1.0 + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 0 + 0 + + com.atmel.avrdbg.tool.stk500 + + 0x1E950F + + + + 125000 + + ISP + + com.atmel.avrdbg.tool.stk500 + + + STK500 + + ISP + 125000 + + + + + + + + + + + + + + + + + -mmcu=atmega328p + True + True + True + True + False + True + True + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + True + True + True + True + -fno-threadsafe-statics -std=c11 + True + True + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + True + True + True + -fno-threadsafe-statics -Wextra -std=c++17 + + + libm + + + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + + + NDEBUG + + + Optimize for size (-Os) + + + NDEBUG + + + Optimize for size (-Os) + + + + + + + -mmcu=atmega328p + True + True + True + True + False + True + True + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + True + True + True + True + -fno-threadsafe-statics -std=c11 + True + True + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + True + True + True + -fno-threadsafe-statics -Wextra -std=c++17 + + + libm + + + + + %24(PackRepoDir)\Atmel\ATmega_DFP\1.4.346\include + + + + + DEBUG + + + Optimize (-O1) + Maximum (-g3) + + + DEBUG + + + Optimize (-O1) + Maximum (-g3) + Default (-Wa,-g) + + + + + + compile + + + compile + + + compile + + + compile + + + + + + + \ No newline at end of file