Arduino (PCI) Express

It is almost impossible these days to find a PC with old ISA card slots. Full size PCI card slots are in danger of going the same way. Many PCs today feature PCI Express connectors. PCI Express offers a lot of advantages including a small size, lower pin count, and a point-to-point serial bus topology that allows multiple simultaneous transfers between different pairs of end points. You’ll find PC Express connectors in things other than PCs too, including a lot of larger embedded systems.

If you ever wanted to prototype something on PCI Express, you’d usually turn to an FPGA. However, [moonpunchorg] posted a workable design for an Arduino on a mini PCI Express board. (As [imroy264] points out in the comments, the board is using the USB port present on the PCI-E connector.) The design files use KiCAD so it should be fairly easy to replicate or change. Naturally, there are pins on the edges to access I/O ports and power. You do need to use ISP to program the Arduino bootloader on the chip.

The board appears to a host computer as a SparkFun as a Pro Micro 3.3V board, and from there you could easily add function to a computer with a PCI Express slot using nothing more than the Arduino IDE. The board is known to work with the VIA VAB-600 Springboard and VIA VAB-820 boards, although it is likely to work with other PCI Express hosts, too.

78 thoughts on “Arduino (PCI) Express

    1. Now that I reread it, that’s a good point. I’ll make an edit and thanks for pointing that out. I mentioned at the end it was USB, but after rereading it, I agree it wasn’t very clear. Thanks again!

      1. You will also need to remove the “although it is likely to work with other PCI Express hosts, too.” end line. And the start line.

        And the first paragraph, because it’s now unrelated.

        Oh, and nearly the complete second paragraph.

        I think it’s fair to say you basically have to re-write the article.

          1. Wow, I never meant to put the writer as person down. Point is, the article has a wrong title (using the USB on a Mini-PCIe connector is *not* doing PCI express), and generally is written aimed at the wrong point. I really consider it fair to say it has to be rewritten — by the author of that article, because I think Al is perfectly capable of writing this as an awesome article!

    2. Like many, if not most PCIe network, serial, parallel, whatever cards.
      They call themselves super fast PCIe cards, but use in fact the same USB to something chips that USB dongles do.
      If this is legit for major hardware manufacturers, why not also for Arduinos?

        1. That’s sadly not really true. A growing amount of notebooks use USB3-to-Gigabit-Ethernet bridges. There’s basically one supplier of such chips, and the firmware is terrible. Like so terrible, in a direct connection between two devices, without a single reason, they reorder packets, which is fatal to some protocols (in this case: real time measurement devices. If you’re doing real time measurements, you don’t design your protocol to reorder things if they somehow got reordered on the flight — no sense in saving data that comes “too late”, anyway):

          1. The ability to retransmit a failed packet and still receive it is a feature not a failure.

            At the transport layer the card does not know about packet numbering.

            Packet reordering is supposed to happen in software. This is why tcp exists.

        2. Not quite, most mini-PCIe form factor wifi / 3G cards I’ve seen are actually work only over the USB 2.0 lines.

          There are some PCIe connectors that don’t even do PCI, for example the VAB-600 that I used first uses only USB (and, for the record, I2C) lines to communicate: http://viaembedded.github.io/docs/springboard-user-manual/io_interface.html#mini-card-slot That’s just because it’s easier and simpler to implement USB stuff than PCIe.

          The other one I tried, the VAB-820 uses both USB and PCI: http://viaembedded.github.io/docs/vab820-user-manual/io_interface.html#mini-pcie-slot though that doesn’t affect this little board…

        1. Coowl youre here, well I wanted to make something similar but then started to wonder if I can cheaply utilize more of those pins. Fpga’s arent cheap but, a clpd might be helpful to “optional” change some pins to a “more powerful” mcu? before I saw this post, I already dreamed of a mPCIe card that could maybe talk to the SIMcard connector my laptop has (http://www.instructables.com/id/Running-mini-PCI-e-3G-card-with-USB-mini-PCI-e-t/step2/Soldering-the-WIRE-to-the-mini-PCIe-card-pin/)

          Basically “misuse” the simcard connector for IO or serial. Maybe scan/controll the SMBbus (dunno about the speeds) and do Leds stuff (the onboard ones).
          So yeah, your board is a great start, and maybe combining it with something like the Xilinx ZYNQ-7000 will do a trick or two? (im realy dreamy with this, and dint spin a board at all because of this). maybe just the Xilinx… adding a usb hub and we are having a computer inside our computer. (also an idea of protecting my Bios with coreboot… but again, too much)

          1. Yeah, CPLD’s looks quite interesting, though haven’t used them yet. Have some FPGA’s and that would be cool to have in the future, though don’t like that most of them need closed source software to work (heard of some reverse-engineered FPGAs, so those might be candidates). As for the pins, the edge of the card is pretty much covered already, so not much else to do, unless going to smaller pin spacing (and that would probably also mean more than 2-layer board for routing, but that depends).

            Misusing the SIM is an interesting idea. I know that the mini-PCIe connector has some wiring to the SIM slot (and my one of my testing boards has a SIM slot too), though if I recall correctly, maybe that wiring is not totally universal, meaning that it might need some different variations for different board models.

            The Xilinx ZYNQ-7000 line is cool (met it through the Parallella which uses that too), though that would most definitely need a heatsink, I think, and that doesn’t fit the mini-PCIe card standard. Again, probably good for a hack, not that good for a first try.

            The USB hubs are tricky too a bit, learning from experience, e.g. this USB lines are already “behind” a hub on the board I’m using, and somehow that’s a bottleneck. I don’t understand USB well enough to know beforehand how these devices would play with each other, so tried to be conservative.

            Cheers for the ideas! I hope there will be more boards with mini-PCIe connector so can give these ideas a spin indeed!

    3. So it is an USB device connected in PCIe slot. A lot less interesting than a real PCI. I don’t know the PCI or PCIe protocol would it be complex to implement it on an MCU?

      It would be interesting as one could make is own peripheral card without USB latency.

      1. The protocol itself is not so complex. You could make a PCI card with discrete logic, if you don’t need plug and play. PCI-e is much more complex, but typically you use a interface core that is in the FPGA or chipset you use. From then on it is simply memory read and write.

      1. The board posted is a older version of the board pictured with just components placed (in significantly different places than the pictured board) and no traces drawn.

  1. The whole paragraph about full size PCIe cards is msleading, as is the article title since that’s what most people associate with PCIe. This hack won’t work on them because the USB line is specific to the mPCIe form factor.

    If you want to put an Arduino in a regular PCIe slot, you can use the SMBus lines, which are just I²C with additional constraints.

    1. Hi, creator here, indeed it should be “full-size mini-PCIe” correctly.

      The size is mentioned on the project’s page to distinguish from the “half-size mini-PCIe” cards that have fastening screws differently would not work with this board.

  2. What is the point of using a PCIe slot for Arduino??
    Make a wiring error and blow the host computer?

    It’s completely stupid, PCI-e =>several Gbytes/s bandwith; Arduino => a few MBytes/s, so PCI-e isn’t even needed. And it isn’t even PCI-e, it’s just USB-3.0 from chipset.

    1. Most of the motherboards still have 10pin serial port header on them, so it would be more logical to make 10pin header arduino board for connecting directly on the motherboard. Or using one half of 10pin USB header on the board. Using mPCIe is a waste.

      1. Hi, creator here, this is mostly aimed at ARM single board computers, and while they have (usually 4 pin) serial connectors, those are used for debug terminal most of the time. And can’t screw things down either.

        Yeah, using a mini-PCIe is a waste, except if you are not using that connector yet, in which case why not?

    2. Hi, creator here. Very good point regarding wiring errors. Hence the fuse included (1.1A, the mini-PCIe specs are a bit above that, so playing it safe), and I think usually it’s fused on the host side as well (though not 100% sure)

      Actually, it’s USB 2.0 only. Also, not all mini-PCIe connector has PCI lines connected, while I think USB is always there.

      The point is not bandwidth but I/O and analog capabilities (sensors, control, monitoring, and so on), and the Arduino being fastened to the host board (not just plugged in). Definitely not good for everything, but it’s good for some things I wanted to use it for.

    1. Thanks for the link. I was just thinking that while I can’t be bothered to build my own, I’d sure buy one. Given the small quantities at which this is undoubtedly being produced, I don’t think the price is unreasonable. I’m ordering one!

      1. hey, creator here, thanks a lot! :) hope you will like it.

        yeah, at the moment it’s all hand assembled, and I have 1 for testing, and 3 that was listed on Tindie. Now I’ll definitely have to come up with some more scalable production method.

    2. Hi Steve, creator here, thanks for posting the link!
      Out of curiosity, how did you come across it the first place?

      I’m working on ramping up the volume to make it cheaper. Looking at assembly houses like CircuitHub, I’d need to order around 50 pieces just to break even. Now checking other places too like Seeed Studio.
      At the moment they are all hand assembled.

      1. Hi, sorry it took me a while to reply (I had notifications turned off). I check the ‘newest’ section on Tindie every couple of days and the possibility of putting a development board in a laptop seemed interesting to me.
        When you only look at the hardware, to me it’s hard to justify 6 times the price of a Pro Micro clone (off of eBay) just for a modified PCB. But I get that for roughly 10$ of components you’d sell it for 30$ (isn’t that some rule of thumb?) considering they’re hand assembled and low quantity.
        How low could you push the price with an assembly house? Still, 50 pcs would be quite a commitment. You could also sell just the PCB or another board that breaks out the USB and maybe some other ‘interesting’ pins. This way you’d save yourself the assembly work and could offer them for a cheaper price. I’d be very interested in something like that. Also, the commitment and risk in ordering let’s say 20 PCBs would be considerable less.

        1. Hi Steve, thanks for the pointers! Your rough calculation is almost there, the components are around $10/board if I order 10pc worth of them + PCB about $2.5/board (again 10pc from Seeed) + packaging and a mounting screw is about $15 altogether, not counting assembly. At the moment the assembly takes about an hour + some testing (need better tools, I know). From CircuitHub the quote I got for 100pc at about the same $15.

          The lowest I can go with CircuitHub is ~$8.7/pc around 5000 units (and go up again above that): PCB $0.36, components: $5.36, assembly $3.04 per piece. Can’t reduce the components count much so the assembly will likely be the same whatever components I use. For the individual parts, the MCU is 2/3 of the cost there ($3.5/pc at 5000pc), so not much to reduce either.

          I’m also asking Seeed Studio, but haven’t heard back from them yet.

          So at the moment I’m more like 2x, not like 3x of components. I know I need to work on the pricing, that will definitely evolve with time. Too many unknowns, both in hardware and software, at the moment, so want to play things a bit safer.
          It’s interesting to go through the detailed numbers, hope you don’t mind either!

          Breaking out other PCIe pins is certainly a good idea, though have to run through the docs. One of the board I’m using only have the USB, an I2C line, and the onboard SIM socket as interesting. Another one has USB, I2C, JTAG, and PCIe (but no SIM)… I guess there could be maybe a breakout for 3.3V USB and I2C, that seems commonly supported maybe…

          What’s your device of choice for reference?

          1. Hi Gergely, that’s very interesting information. I figured the MCU to be the majority of the cost though I estimated it to be below 5$ (going off of eBay prices again) and the remaining components to be only a few $. I’d also estimate that you could get the PCBs for ~1.60$/pc from dirtypcbs.com (10 panels/PCBs containing 4 of your boards each for 25$). I think these additional 2/3 in that rule of thumb account for assembly, packaging and shipping but I’m not sure if I remember it correctly.
            It’s interesting that the pricing from CircuitHub isn’t that far off your cost. It’ll be interesting to hear what Seeed says.
            I agree that you should play it safe, especially since one never knows how many units will eventually be ordered which seems quite low at the moment but you probably have better insight in how big the interest is.
            I2C and JTAG is exactly what I meant but I didn’t know those were on the connector. I agree that 3.3V, USB and I2C would be great on a breakout since they are so common. It’d make sense to include the protection you and others already mentioned on it or at least the footprints such that one can populate them if desired.
            What do you mean by device of choice?

  3. If USB is in fact available on the mPCIe slot, this could be implemented very simply with an arduino shield, or just a mPCIe to USB converter as mentioned above. Being USB, nothing whatsoever would need to be done if the Arduino UNO or other USB enabled clone was used.

  4. OK…..

    Looks like I’m the only one who’s going to say this.

    No thanks.

    The AVR is a nice platform. But outside of some sort of permanent installation in an educational setting, I see little value in shoving an AVR inside a computer. If was going to use up a slot and take space inside, I’d shoot for, at a bare minimum, an ARM or an FPGA, or better yet, both.

    I like the AVR. I also did something similar shoving a 32U4 and soldering the USB connections to a header inside the DVD bay of an old laptop to save carrying around a bunch of cables and a dev board. But I took it out after a month when I realized I didn’t really need it as an experimenters platform and I wasn’t interested in any I/O expansion off the laptop.

    It’s a cool idea but shoving a piddly 8 bit processor in there when you can very well use an ARM is well….

    Sorry.

    1. Hi, creator here. No worries, I’m glad that it doesn’t makes sense in every setting!

      Mostly targeting embedded use cases, for the secure attachment and being inside the housing of the unit can be important. Also, many ARM boards suck quite a bit with I/O. Can have a few Digital channels, but not with that amount of support as Arduino does, and then there are the Analog channels too. Then there’s the ability to be a sort of like low-power co-processor. So it’s about expanding the usability of the host for specific niche uses….

      Thanks for the comments, though!

      1. Good of you to be understanding.

        Can we dissect your statement about ARM and AVR though?

        The Atmel 32U4 is an 8 bit CPU with 26 I/O, 12 channel 10 bit ADC amongst other useful features. Just setting it up for those Arduino guys who don’t read their data sheets. Sells from Digikey for ~$3.06 each for 1500 units ($6.50 for singles). Yes, I know a big business can buy these for far less for volume, I’m just using a marker to get a point across here.

        A search on Digikey for a comparable ARM reveals the STM32F042K6T6. An M0 processor selling for $3.04 for singles. It sports 37 I/O with 10 channel 12 bit ADC. You get a slightly cheaper 32 bit ARM, 11 additional I/O, a handful of additional communication interfaces (including CAN), DMA, RTC and a few other tidbits. You loose 2 ADC channels, more than half of your PWM channels over the 32U4 (I have never ever used every PWM channel the 32U4 offered so I doubt it’s much of a loss). It’s biggest drawback would be that it’s a 3.3v part (5v tolerant inputs), but since there’s a growing number of 3.3v only parts, I find myself building an equal number of 3.3v5v circuits for both AVR8 and ARM projects anyways.

        Not sure what you mean with the low power co-processor business. The exact same can be said for ARM.

        The AVR8 certainly has its uses. Given a choice between two, otherwise identically configured, boards using either the 32U4 or the STM32, I would choose the STM32. I’m more intimate with the AVR8 architecture, but that isn’t enough to ignore what the STM32 has to offer.

        I don’t have any particular love for the STM32 series. It’s what came up to the surface.

        1. Oh sorry. I knew the PCIeduino above is running at 3.3v. So the fact the 32U4 supports 5v is irrelevant for this specific application. However, it can be, and is often, a factor in other designs.

        2. Do I understand correctly that the main issue in your comment is the choice of the ATmega32u4 for the core?

          If yes, then it was because it’s a simple enough design for a proof of concept board. I was happily surprised that it started up and run on the first try. I was already considering both ARM Cortex-M and the AVR ATXmega series which both are much better than the the ATmega.

          The design goals at this time were simplicity and if possible then Arduino IDE compatibility. It was simpler because there’s a lot of community knowledge around the 32u4, and needs much fewer components to get it running, when I am not sure how things should work with mini-PCIe in the first place.

          Future versions would power up for sure, and I hope I can see interesting designs too! (it’s people like you with more experience with the other MCUs that can make it happen:)

          Here the design goals were all fulfilled, and there’s plenty more to do, so makes me happy with it.

  5. Completely forgot about the USB pins on the mini PCIe port! This is the (almost) perfect solution for anybody that needs easy access gpio pins in a mobile solution! extend the AVR pins to the outside of the notebook with an old IDE cable and you are done. Connect wires directly to the IDE connector attached to the outside of the notebook or make a simple plugin adapter for shields.

    1. I still prefer USB->serial cable, if you screw something up you end up with few bucks less, if you screw up something that’s connected directly to your PCIe bus it costs much much more.

    1. Benefit is being attached to the host securely with a screw, instead of dangling from a USB port. Also it fits inside the housing of the host boards / systems, so less external exposure.

      What kind of risk you see? I’m curious to improve it (creator here).
      Thanks!

      1. Well, the part I don’t understand is why put an embedded processor in a computer and potentially give it access to the bus without timing and isolation consideration.
        Isolation from external connections
        1. hazardous voltages and transients
        2. Reject common-mode voltages
        3. Removal of ground loops
        that you connect to the AVR board.
        The schematic I found wasn’t readable, at least it was blury on my system, but I wasn’t seeing those considerations in what I could make out of the design.
        You’ re connecting to the USB 3 available on the mPCIe bus, but why do that internally?
        You cut down on external exposure of a $30 board but open your $$$$ system up to internal exposure to hazards.
        Best of luck, just my opinion.

        1. Updated the github repo, the schematic was there, just in a development branch, here you go, a non-blurry version: https://github.com/moonpunchorg/pcieduino/blob/master/pcieduino.pdf

          It’s basically port of the SparkFun Pro Micro 3.3V/8MHz board: https://www.sparkfun.com/products/12587 and probably has all the disadvantages that it might have.

          If you have any comments how to improve the system, I’m all ears, seriously! It’s a very good learning experience, and I’m almost surprised that it worked.

          Also, it’s mostly a proof of concept at the moment. And most of the systems it is aimed at are not $$$$ but embedded ARM single board computers, just a few times more expensive than this board. Yeah, things can be exposed, but that’s why it’s an embedded system.

          1. If you were able to change one thing at this point in production I would add some opto-isolated inputs. That would add some to the cost, but add a lot to the safety.

  6. Hi, creator here, happy to answer any questions!

    I was wondering how it suddenly sold out on Tindie while I was asleep last night! :) Will have to assemble more boards, I was quite conservative, as the software is largely untested at this point (but it does flash and do stuff).

  7. Sorry Folks, but my little industrial computer with a PICMG pentium motherboard and isa extender board filled with only 5 cards giving me over 200 opto-isolated inputs and 100 isolated relay outputs all individually addressible, running windows98 and using turbo-pascal 7 puts me in retro-controller heaven….!!!!!

  8. now do same with teensy 3.1 chip. make it half lenght mini-pcie and add mpu9050 and rgb led… that would make me wanna order 1 for my mitx pc (led mostly) and 1 for my laptop (lets say using laptop itself as a joystick or rotate display etc etc)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s