From d3afcc2f37df0dac79594163103917cde0e80a2e Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Mon, 25 Mar 2019 13:42:32 +0100 Subject: [PATCH] mcp23s17 ansprechbar --- B15F.elf | Bin 8772 -> 9400 bytes B15F.hex | 52 +++++++++++++++++++++++++--------- main.cpp | 7 ++--- mcp23s17.cpp | 77 ++++++++++++++++++++++++++++++++++----------------- mcp23s17.h | 15 +++++++++- spi.cpp | 7 +++-- spi.h | 2 ++ 7 files changed, 114 insertions(+), 46 deletions(-) diff --git a/B15F.elf b/B15F.elf index 209942f2435c4c7f3efd9431fafc8ddc64f15ca7..d3db3be5b50c41c98c9ed590203f7b25a7207503 100644 GIT binary patch delta 2157 zcmbW2ZETZO6vxkf+F~8eQtGw<8LTaHsEg^w%Qk{BtWXUvDiMNYEN%mr4L&d^bI4ns zH6;;~Ic#p1%;$p+K9GP$Nv6aPk{E-Efyfs52vQ9%UkG!H0X_iZf1an$dbybWO9^qF7p6=ye#K=v>uk$<4ldfuuUTxh**ZLl_4y*K*Krg9&jZ5rG%*gV)| zZLyjyxnImT`@i)MJP^Cnt?78$KTshr$!qeqD2we#9Z7wfD$ees*6WUyrq-NmwZ&Yk z!(O|Vxs<8M1hD(RGqmX$%xs#TF2&YA-J}0+5!;jurkm{FiYVyNHl;(Mgn}ZoV@?KE zEERL~DCjv|7Q2j%kXRLV`ZVcWCRd#8zytK!RzG!(Io8+Yd@mK9F~=IAyK+>NijU+i z@%nI$@k7YS8FHfJkx}H46Qy67+-p37=(ZQoOz&dG!6EPp*yn98Q5d{VfuGz(Api1Mfod440`(fN1iJ_F4cBP?O&V|2c&Di?>;qdkJjl~9=m?l7 z#UEJn(tyo2f(`myi~mCLb3xy0{$DgUf9C*2fidu1%n%=l0v^FGhiq{$D^iAjQJ<_5 ztSVN+{iI0#3ivc~)a2tE!HS|Lt;51^a8~9wG;@Od2;)gQo(!O*#)o*na)Hk@|0#{n zJi*ZaM=ZE+$dZnLXW+&GmD44yfh14-VDF<$G|-^KKZ^9&rf;) z?4Dc6*vk03+(p5Pul)bjjw|9_1Xpe1199*!3E9qP32!`9}vNU zTM-xVGMFXgBz&XAzTrD_>qS}9n`;~1Sh;@D;tjR+^?Ta8S8Y$m6PC+P8IgC0iN_=At@k znKqy?(Idy^zcoj7Dz(HD!^EF@; delta 1550 zcmZ9LZAg<*6vxl=Z03k*YGo3kbJ`N4=v5;^?8PFY5{n`=TtzQfRGJtCwdn#YY_;x2 z(*HaYRHrpIDJdMNy4dBdhXDxW$&_IkLCtL zWDiC#iEN>{hATYJXfU=J+YRsUb5FfLd!t>kOHo^>G29ex4!e_$#-3!8u{YUl*g{96 zIS;c_$>E+6@lCrHAEg&W{sCJkp|$zkzBN8u$o(UsdAkB#_TX9a#R9S1;6XYc^G9>$ zn2!I3$CL+XO>AGRE#}1*d+?&TVA-HiWZ3euK(Eon)xwm12x8Vf50}g%4@FmCJv4^o z054OxR$|^?51#Okr`?jB{SPaA65Kl;pZzar}u?0B44S;-2(U#i2&wjqD(uxK*)t zD%`EGADp>D?%;KB0wIeq3kdyxplo;sPS?VUffJ?&!6R5_D*OnZ=zvB|sD9!RTImby zatB5f&P6c?;KRe=LCbeyVL?k-mycKcmlK%8Zy=t|ksSDnri0}KB?`|6&p@!Lh{9L0 zTCs1Icn3e4T~L@g;lK%xgU5c7G427&0dGhF*#9=~M*$pz3%GBMe4SIRi3P<+#6WR( zVdIufD>kpKU$S)D;_B)X`#b87wRhAV63a^-35(<3%$Cmm`#O%bx2&L+%yLPU*igDP z(qCGo=_yV8a#rfCnkX!DGOa9gvDgc-NEa6&j_aZyLZ2!=LCnt=dbvxl%NLap(Gt;6 b?#lW+9o-gZ%FBupc#1F03c1Qmqlx|lhW`5O diff --git a/B15F.hex b/B15F.hex index edb805b..4092d27 100644 --- a/B15F.hex +++ b/B15F.hex @@ -6,19 +6,45 @@ :100050000C9464000C9464000C9464000C94640090 :100060000C9464000C9464000C9464000C94640080 :100070000C9464000C9464000C9464000C94640070 -:100080000C9464000C9464000C9464009F00112490 +:100080000C9464000C9464000C94640070011124BE :100090001FBECFEFD0E4DEBFCDBF21E0A0E0B1E0D6 :1000A00001C01D92A430B207E1F710E0C7E4D0E030 -:1000B00004C02197FE010E94AA00C634D107C9F7E7 -:1000C0000E9495000C94B3000C9400000895259AAA -:1000D0002698279A529A539A549A80EB84B980E5CD -:1000E0008CBD81E08DBD08955A985B985C9860FD49 -:1000F0005A9A61FD5B9A62FD5C9A08956EBD0DB4DB -:1001000007FEFDCF87E893E10197F1F700C00000FB -:100110008EB50895FC01718360834283089560E485 -:10012000FC01808191810C947E0083E091E00E942B -:10013000670088E08EBD0DB407FEFDCFFBCF83E0E6 -:1001400091E00E94660042E063E071E080E091E0AF -:100150000C948A00EE0FFF1F0024001C0BBE0790BA -:0A016000F691E02D0994F894FFCF0A +:1000B00004C02197FE010E947B01C634D107C9F715 +:1000C0000E9458010C9484010C9400000895249A15 +:1000D000259A2698279A529A539A549A80E58CBD6D +:1000E00081E08DBD5A985B985C985A9A5B9A5C9AAD +:1000F00008955A985B985C9860FD5A9A61FD5B9AE6 +:1001000062FD5C9A08956EBD0DB407FEFDCF8EB5FD +:100110000895FC0171836083428308951F93CF93F8 +:10012000DF93EC01162F6A81888199810E94790002 +:1001300060E4888199810E94830060E088819981D0 +:100140000E948300612F888199810E94830067E06B +:1001500088819981DF91CF911F910C9479001F9331 +:10016000CF93DF93EC01162F6A81888199810E94D9 +:10017000790060E4888199810E94830061E0888130 +:1001800099810E948300612F888199810E94830058 +:1001900067E088819981DF91CF911F910C9479005C +:1001A0001F93CF93DF93EC01162F6A818881998189 +:1001B0000E94790060E4888199810E94830062E155 +:1001C000888199810E948300612F888199810E9492 +:1001D000830067E088819981DF91CF911F910C9412 +:1001E00079001F93CF93DF93EC01162F6A818881EA +:1001F00099810E94790060E4888199810E9483003E +:1002000063E1888199810E948300612F88819981AF +:100210000E94830067E088819981DF91CF911F91CF +:100220000C9479001F93CF93DF93EC016A8188814E +:1002300099810E94790061E4888199810E948300FC +:1002400062E1888199810E94830060E088819981C0 +:100250000E948300182F67E0888199810E947900AD +:10026000812FDF91CF911F9108951F93CF93DF933B +:10027000EC016A81888199810E94790061E488811A +:1002800099810E94830063E1888199810E948300A3 +:1002900060E0888199810E948300182F67E088813F +:1002A00099810E947900812FDF91CF911F9108954C +:1002B00083E091E00E94670060E080E091E00E94AE +:1002C0008E006FEF80E091E00E94AF0080E091E04F +:1002D0000E943501682F80E091E00E94D000F6CFA7 +:1002E00083E091E00E94660042E063E071E080E01C +:1002F00091E00C948900EE0FFF1F0024001C0BBE40 +:0C0300000790F691E02D0994F894FFCFCF :00000001FF diff --git a/main.cpp b/main.cpp index def26d2..b074435 100644 --- a/main.cpp +++ b/main.cpp @@ -9,12 +9,11 @@ MCP23S17 beba0(spi, SPIADR::BEBA0); int main() { spi.init(); + beba0.setDirA(0x00); // alle Ausgang + beba0.setDirB(0xFF); // alle Eingang while(1) { - - SPDR = 8; - while(!(SPSR & _BV(SPIF))); - //spi.pushByte(8); + beba0.writePortA(beba0.readPortB()); } return 0; diff --git a/mcp23s17.cpp b/mcp23s17.cpp index 9597ba9..251ead8 100644 --- a/mcp23s17.cpp +++ b/mcp23s17.cpp @@ -2,33 +2,60 @@ MCP23S17::MCP23S17(SPI& spi, uint8_t adr) : spi(spi), adr(adr) { - } - -void MCP23S17::setPort(uint8_t port) const +void MCP23S17::setDirA(uint8_t dir) 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); - }*/ + spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.pushByte(MCP23S17_DIRA); + spi.pushByte(dir); + spi.setAdr(SPIADR::NONE); +} + +void MCP23S17::setDirB(uint8_t dir) const +{ + spi.setAdr(adr); + spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.pushByte(MCP23S17_DIRB); + spi.pushByte(dir); + spi.setAdr(SPIADR::NONE); +} + +void MCP23S17::writePortA(uint8_t port) const +{ + spi.setAdr(adr); + spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.pushByte(MCP23S17_PORTA); + spi.pushByte(port); + spi.setAdr(SPIADR::NONE); +} + +void MCP23S17::writePortB(uint8_t port) const +{ + spi.setAdr(adr); + spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.pushByte(MCP23S17_PORTB); + spi.pushByte(port); + spi.setAdr(SPIADR::NONE); +} + +uint8_t MCP23S17::readPortA(void) const +{ + spi.setAdr(adr); + spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); + spi.pushByte(MCP23S17_PORTA); + uint8_t port = spi.pushByte(0); + spi.setAdr(SPIADR::NONE); + return port; +} + +uint8_t MCP23S17::readPortB(void) const +{ + spi.setAdr(adr); + spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); + spi.pushByte(MCP23S17_PORTB); + uint8_t port = spi.pushByte(0); + spi.setAdr(SPIADR::NONE); + return port; } diff --git a/mcp23s17.h b/mcp23s17.h index d087c3a..4179c0f 100644 --- a/mcp23s17.h +++ b/mcp23s17.h @@ -3,11 +3,24 @@ #include "spi.h" +constexpr uint8_t MCP23S17_DIRA = 0x00; +constexpr uint8_t MCP23S17_DIRB = 0x01; +constexpr uint8_t MCP23S17_PORTA = 0x12; +constexpr uint8_t MCP23S17_PORTB = 0x13; +constexpr uint8_t MCP23S17_READ = 0x01; +constexpr uint8_t MCP23S17_WRITE = 0x00; +constexpr uint8_t MCP23S17_OPCODE = 0x40; + class MCP23S17 { public: MCP23S17(SPI&, uint8_t); - void setPort(uint8_t) const; + void setDirA(uint8_t dir) const; + void setDirB(uint8_t dir) const; + void writePortA(uint8_t) const; + void writePortB(uint8_t) const; + uint8_t readPortA(void) const; + uint8_t readPortB(void) const; private: SPI& spi; diff --git a/spi.cpp b/spi.cpp index 625912d..a99cc05 100644 --- a/spi.cpp +++ b/spi.cpp @@ -8,22 +8,24 @@ void SPI::init(void) const { // Konfiguriere SPI DDRs + dMode(SLSL, OUT); 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); + // waehle keinen SPI Slave aus + setAdr(SPIADR::NONE); } /*void SPI::setFreq(uint32_t freq) const @@ -49,6 +51,5 @@ 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 d5e83ae..539867b 100644 --- a/spi.h +++ b/spi.h @@ -5,6 +5,7 @@ #include #include "pio.h" +#define SLSL B4 #define MOSI B5 #define MISO B6 #define SCLK B7 @@ -16,6 +17,7 @@ enum SPIADR { BEBA0 = 2, BEBA1 = 3, + NONE = 7, }; class SPI