From 08795e75475d714dca4e2adde1dbe6d9df71effc Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Mon, 25 Mar 2019 13:00:22 +0100 Subject: [PATCH] endlich ein SPI sclk signal --- B15F.aps | 2 +- B15F.elf | Bin 7892 -> 8772 bytes B15F.hex | 36 +++++++++++++++++++++++------------- Makefile | 2 +- main.cpp | 18 ++++++++++++++++-- main.hex | 20 ++++++++++++++++++++ mcp23s17.cpp | 34 ++++++++++++++++++++++++++++++++++ mcp23s17.h | 17 +++++++++++++++++ spi.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ spi.h | 22 ++++++++++++++++++---- 10 files changed, 172 insertions(+), 21 deletions(-) create mode 100644 main.hex create mode 100644 mcp23s17.cpp create mode 100644 mcp23s17.h diff --git a/B15F.aps b/B15F.aps index d38d48c..1790901 100644 --- a/B15F.aps +++ b/B15F.aps @@ -1 +1 @@ -B15F22-Mar-2019 14:29:5422-Mar-2019 16:03:17241022-Mar-2019 14:29:5444, 19, 0, 730AVR GCCB15F.elfF:\JTAGICE mkIIATmega1284.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000spi.cppmain.cppMakefilespi.hdefault\B15F.lssdefault\B15F.mapc++NOatmega128111B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega1284111B15F.elfdefault\1C:\avr8-gnu-toolchain-win32_x86\avr\include\C:\avr8-gnu-toolchain-win32_x86\avr\lib\libc.a-Wall -gdwarf-2 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault0C:\avr8-gnu-toolchain-win32_x86\bin\avr-g++.exeC:\WinAVR-20100110\utils\bin\make.exeF:\spi.hF:\spi.cppF:\main.cppF:\Makefile00000spi.h100001main.cpp100002Makefile100003spi.cpp1 +B15F22-Mar-2019 14:29:5425-Mar-2019 12:57:42241022-Mar-2019 14:29:5444, 19, 0, 730AVR GCCB15F.elfF:\JTAGICE mkIIATmega1284.xmlfalseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000spi.cppmain.cppMakefilemcp23s17.cppspi.hmcp23s17.hdefault\B15F.lssdefault\B15F.mapc++NOatmega128111B15F.elfc++\0-Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefaultYESMakefileatmega1284111B15F.elfdefault\1C:\avr8-gnu-toolchain-win32_x86\avr\include\C:\avr8-gnu-toolchain-win32_x86\avr\lib\libc.a-Wall -gdwarf-2 -DF_CPU=20000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault0C:\avr8-gnu-toolchain-win32_x86\bin\avr-g++.exeC:\WinAVR-20100110\utils\bin\make.exeF:\spi.hF:\mcp23s17.hF:\spi.cppF:\main.cppF:\MakefileF:\mcp23s17.cpp00000main.cpp100001Makefile100002spi.h100003spi.cpp100004mcp23s17.h100005mcp23s17.cpp1 diff --git a/B15F.elf b/B15F.elf index 6ff0cc641ab2a68cdb53bd7cf80da8f76a882da1..209942f2435c4c7f3efd9431fafc8ddc64f15ca7 100644 GIT binary patch delta 2477 zcmc(h|4-C)9LHau&z*7t2X~wj0tYw|Fq6Sy!CX1O&@3eeHYVskaK|a(>7Cqxxm9;W zo7Ie@&ynnwi<)a?KbTT$tw7sc+E${|^;5Zz&Nh}?#n$47fb04C+7wwHMMPCZw1tYuL}g^9R1&~ZbglJ3zXSj<#AbWA)Gw8@my{|qaeS4HJoVT(ZHLE*k#6e4n~V_znph1N{8O1|Levu?woWkV?9 zuU)?A@CzOu!vW0@PczNLU&6DS4_Iv?oz$jyvYzkExkZ^spJ4uxj=#bDdXkHf>zaXY zFXu4bT`r*C**VSwkqrq26r&Gl1)oZ&p%-Z#m@h6j<}!mlHfNcCt&VLJ7O4q>r2sSW z4xIt7;IM&@gY^ZxY0yUvJONpxofF)xbLp+-%?j;Fww*jzAR22PPWe z0Y_q{6Dq5y9?{^Ef0($UcXS5KV@n3A{xbuA#rFKQLE}4e8@v}Q%3?+V_rdxj`U|Yz zu{rivcRb7iOk^<;J&FLUA?F>jg7sUN1HJ)WZc<+c)>;t?s501ZGw?39*A?8O>5*Su zVZSCw@@obj0&8c;xBPwZ9BgyYx!}(Y`ftJUS}4)Dz^mYC%(Vsn4CWo+{MZ43+Ohhj zOK7HFVW8iEX#;0qH3#9ttq5D*il+$yS!BnK{>=$gN*s|@XU|9E03*Jd9~FvJm=Lg+ z%A3He5iJ$WE37l<_ZWB|Sj`E0z7qj3!H*mBNw7ZNS=GNx)vF0VWe2Q)gYXJ2fX`#j zUrn1RPv$(kUfQ|)`TDxuk`(N7OS`0C;6*|&_XGlT#1n8;1uLuNw6#u`$LHL#<_l6p} z<>R@obbT=SpUu9`q!u)F?5$lK6O zlH>{bdxMhqXcy)v$a9#aq}>z9R@c>wWK(&qtJ@kE%h>K}Xy!oOa&i7Mh`OYxOezqo z-^-CDR|UDf?#>EGQ0^h0-`(j;&|Lv5`>ub5F`d-A7n@nCPa&vS@vPIONA7(y;WFf zcUQ`Xn1>1?3c^T($R4DJ$d5pJ3SA=zq7MY0M6~~z-Py+bBy`ww@BN*Rd(XXdXLh)D zVpq4O&lVDGBcdwONTtn`OG_@=(nd&OmauK1Xk5`nuT1Cs-ziqg9#c8H>h z?!?;esh+VOS6s{~Rs9v}bPl#Iytz%{YHmbCbI<4v$z7YRgJu?wU^JSxsnmwCkzzjF zu*AB=wLi`E+`XL6?afpwbA&{G3>rC(s)V5H28r-hi?&|3q&v zKsbIL{lEN~#cVuGgPjnL&tJm2N+mGZ3)sFSK&2Xq4}k3p9Fy|frT9x=a+vFzCvY45 z5XhI%qocboB|MV&1=uQ(cQ7dVhb11D_>08f!9>@&A)SwG)-;%G9^rzNu#!tn2^Zi4 z8#XSLxRT>-J3a`uHo)s01*c9xCl3rKVR(+5A}I4&uz@iPFL(v~7-JWd{WrjtXt-2D zihm&S6OOkP^darX_2mUVrwvK|D)DcyeFyUryE1UeYmy~#L2fW9QPbcig);es(~L_9 zzrkL9eYk*P%aG!|;Ex;t(NvYT@`RX(g?G(dP5_5BeO6cwbmAw)iVVyT45&`~|{M6!(N$A{`gQ zq1JQ9DHIAvnp;kbPeqNQI#4GTd@i-JLc9r-iywhb(X4r$=Eqp{1ihk5bC>g{+j`4* z&15A+Wf=1@RIm|JD}HJDJDD;~PBsyQ)Yv%n>}eltoNdWVMN|j#)*S}h&2?EsuHfZ9d2 -#include "spi.h" +#include +#include +#include "mcp23s17.h" + + +SPI spi; +MCP23S17 beba0(spi, SPIADR::BEBA0); int main() { - SPI spi_master; + spi.init(); + + while(1) { + + SPDR = 8; + while(!(SPSR & _BV(SPIF))); + //spi.pushByte(8); + } + return 0; } diff --git a/main.hex b/main.hex new file mode 100644 index 0000000..d91cc8e --- /dev/null +++ b/main.hex @@ -0,0 +1,20 @@ +:100000000C9446000C9450000C9450000C9450003A +:100010000C9450000C9450000C9450000C94500020 +:100020000C9450000C9450000C9450000C94500010 +:100030000C9450000C9450000C9450000C94500000 +:100040000C9450000C9450000C9450000C945000F0 +:100050000C9450000C9450000C9450000C945000E0 +:100060000C9450000C9450000C9450000C945000D0 +:100070000C9450000C9450000C9450000C945000C0 +:100080000C9450000C9450000C94500011241FBE8E +:10009000CFEFD0E4DEBFCDBF0E9486000C9490006D +:1000A0000C940000CF93DF93CDB7DEB784E290E0ED +:1000B00024E230E0F9012081206BFC0120838CE4F4 +:1000C00090E021E5FC0120830000DF91CF910895AD +:1000D000CF93DF931F92CDB7DEB789838EE490E094 +:1000E0002981FC0120838DE490E0FC0180818095D2 +:1000F000881F8827881F882309F0F5CF8EE490E0B9 +:10010000FC0180810F90DF91CF910895CF93DF9311 +:10011000CDB7DEB70E94520080E00E946800FCCF9D +:04012000F894FFCF81 +:00000001FF diff --git a/mcp23s17.cpp b/mcp23s17.cpp new file mode 100644 index 0000000..9597ba9 --- /dev/null +++ b/mcp23s17.cpp @@ -0,0 +1,34 @@ +#include "mcp23s17.h" + +MCP23S17::MCP23S17(SPI& spi, uint8_t adr) : spi(spi), adr(adr) +{ + +} + + +void MCP23S17::setPort(uint8_t port) const +{ + + spi.pushByte(0x40); + /* + + spi.setAdr(0); + _delay_ms(1); + spi.setAdr(adr); + spi.pushByte(0x40); // + spi.pushByte(0x00); // DIR A + spi.pushByte(0x00); // alle ausgang + + spi.setAdr(0); + _delay_ms(1); + spi.setAdr(adr); + spi.pushByte(0x40); + spi.pushByte(0x12); + spi.pushByte(0xF0); + spi.setAdr(0); + + /*while(1) { + PORTB ^= _BV(PB7); + _delay_ms(1); + }*/ +} diff --git a/mcp23s17.h b/mcp23s17.h new file mode 100644 index 0000000..d087c3a --- /dev/null +++ b/mcp23s17.h @@ -0,0 +1,17 @@ +#ifndef MCP23S17_H +#define MCP23S17_H + +#include "spi.h" + +class MCP23S17 +{ +public: + MCP23S17(SPI&, uint8_t); + void setPort(uint8_t) const; + +private: + SPI& spi; + const uint8_t adr; +}; + +#endif // MCP23S17_H diff --git a/spi.cpp b/spi.cpp index fd4b7cf..625912d 100644 --- a/spi.cpp +++ b/spi.cpp @@ -6,7 +6,49 @@ SPI::SPI(void) void SPI::init(void) const { + + // Konfiguriere SPI DDRs dMode(MOSI, OUT); dMode(MISO, IN); dMode(SCLK, OUT); + + // Konfiguriere DMUX DDRs + dMode(DMUX1, OUT); + dMode(DMUX2, OUT); + dMode(DMUX3, OUT); + + DDRB = 0xB0; + + // aktiviere SPI, Master Modus, SPI Modus 0 + // F_SPI = F_CPU / 2 (prescaler 2) + SPCR = _BV(SPE) | _BV(MSTR); + SPSR = _BV(SPI2X); + +} + +/*void SPI::setFreq(uint32_t freq) const +{ + +}*/ + +void SPI::setAdr(uint8_t adr) const +{ + dWrite(DMUX1, 0); + dWrite(DMUX2, 0); + dWrite(DMUX3, 0); + + if(adr & 0x01) + dWrite(DMUX1, 1); + if(adr & 0x02) + dWrite(DMUX2, 1); + if(adr & 0x04) + dWrite(DMUX3, 1); +} + +uint8_t SPI::pushByte(uint8_t b) const +{ + SPDR = b; + while(!(SPSR & _BV(SPIF))); + _delay_ms(1); + return SPDR; } diff --git a/spi.h b/spi.h index e180b00..d5e83ae 100644 --- a/spi.h +++ b/spi.h @@ -1,18 +1,32 @@ -#ifndef SPI_MASTER_H -#define SPI_MASTER_H +#ifndef SPI_H +#define SPI_H #include +#include #include "pio.h" #define MOSI B5 #define MISO B6 #define SCLK B7 -class SPI { +#define DMUX1 D2 +#define DMUX2 D3 +#define DMUX3 D4 + +enum SPIADR { + BEBA0 = 2, + BEBA1 = 3, +}; + +class SPI +{ public: SPI(void); void init(void) const; + //void setFreq(uint32_t) const; + void setAdr(uint8_t) const; + uint8_t pushByte(uint8_t) const; }; -#endif +#endif // SPI_H