element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
    About the element14 Community
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      •  Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Avnet Boards Forums
  • Products
  • Dev Tools
  • Avnet & Tria Boards Community
  • Avnet Boards Forums
  • More
  • Cancel
Avnet Boards Forums
ZedBoard Hardware Design PS SPI Pmod JE7 Hardware system
  • Forum
  • Documents
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Avnet Boards Forums to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Not Answered
  • Replies 11 replies
  • Subscribers 353 subscribers
  • Views 2254 views
  • Users 0 members are here
Related

PS SPI Pmod JE7 Hardware system

Former Member
Former Member over 12 years ago

Hello everyone,

I'm in the process of interfacing my Avnet CC3000-Pmod Compatible Wi-Fi Adapter to the ZedBoard via the JE7 Pmod header, which is connected to the PS.

At first I thought this should be a simple thing, since creating a hardware system that includes SPI was so simple, but ...

When I try to use the SPI device (via the SpiPs device driver), I am stuck in the XSpiPs_PolledTransfer() function, waiting for the status register flag that indicates the transmission has finished (XSPIPS_IXR_TXOW_MASK). The reason that the flag never comes, is that I read nonsense values from the register (a 0x2 in this case).
Then I added the XSpiPs_SelfTest() function, which failed at the very first register read. So I'm guessing there is something wrong with my hardware design.

I got the Zynq IP setup & configured as follows:

  +--------------------------------+
  |         ZYNQ               DDR +-----> DDR
  |                       FIXED_IO +-----> FIXED_IO
  |                       USBIND_0 +-
-+ TTC0_CLK0_IN         M_AXI_GP0 +-
-+ TTC0_CLK1_IN    TTC0_WAVE0_OUT +-
-+ TTC0_CLK2_IN    TTC0_WAVE1_OUT +-
+-+ M_AXI_GP0_ACLK  TTC0_WAVE2_OUT +-
| |                      FCLK_CLK0 +--+
| |                  FCLK_RESET0_N +- |
| +--------------------------------+  |
+-------------------------------------+

SPI 1: MIO 10 .. 15
SS[1] IO MIO 14
SPI 1 MIO 10 mosi
SPI 1 MIO 11 miso
SPI 1 MIO 12 sclk
SPI 1 MIO 14 ss[1]

The clock is set to ca. 16MHz, which is the maximum the CC3000 can take.

Has anybody had any experience with the CC3000 Adapter, Pmod or SPI on the ZedBoard? I'd be very glad for any help, since I'm pretty much stuck here.

With best regards,
Darius

  • Sign in to reply
  • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Hi Darius

    If you want to be able to work on the lowest level of SPI by bitbanging, then I can help!

    I did not manage to get SPI 1 to talk to the JE7 pins, however I could do it by enabling GPIO.. I used this to enable writing to an SD card in SPI mode, over the GPIO pins 40-47 (SD card slot)

    ( http://www.zedboard.org/content/sdio-windows-7 )

    #define MIO_09_JE8 t9
    #define MIO_10_JE2 t10
    #define MIO_11_JE3 t11
    #define MIO_12_JE4 t12
    #define MIO_13_JE1 t13
    #define MIO_14_JE9 t14
    #define MIO_15_JE10 t15

    #define PIN_HIGH 1
    #define PIN_LOW 0

    int main(void)
    {
    tXGpioPs Gpio;
    tXGpioPs_Config * ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    tXGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);

    t//set JE1 to output -> pin high
    tXGpioPs_SetDirectionPin(&Gpio, MIO_13_JE1, MIO_OUTPUT);
    tXGpioPs_WritePin(&Gpio, MIO_13_JE1, PIN_HIGH);
    t
    t//set JE1 to output -> pin low
    tXGpioPs_SetDirectionPin(&Gpio, MIO_13_JE1, MIO_OUTPUT);
    tXGpioPs_WritePin(&Gpio, MIO_13_JE1, PIN_LOW);
    t
    t//set JE2 to input -> read pin
    tXGpioPs_SetDirectionPin(&Gpio, MIO_42_SD_P7_MISO, MIO_INPUT);
    tXGpioPs_ReadPin(&Gpio,MIO_10_JE2);

    t//etc etc...

    treturn 0;
    }

    Does that help at all?

    Kenny

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    When looking at several Pmods I have with the Maxim peripheral kit, I was surprised to see no standard for the SPI pins (or I2C pins) on the PMODs. The only pins that seem to be standard are power (Vcc on pins 6 and 12) and ground (pins 5 and 11)

    As such, I took a quick look at the pins and matching them between the FPGA and schematics for the JE Pmod, the only one that connects directly to the PS through the MIO.

    From the MIO pin SPI pin links, schematic for the FPGA on the Zedboard, and schematic for the CC3000-Pmod, I get the following:

    CC3000 Pmod pin; JE pin; FPGA pin; MIO Pin using SP1
      SPI_CS  ; JE1  ; A6  ; PS_MIO13 ; ss0
      SPI_DI  ; JE2  ; G7  ; PS_MIO10 ; mosi
      SPI_DO  ; JE3  ; B4  ; PS_MIO11 ; miso
      SPI_CLK ; JE4  ; C5  ; PS_MIO12 ; ck
      SPI_IRQ ; JE7  ; G6  ; PS_MIO0  ; ???

    So it looks like the IRQ needs to be connected to PS_MIO0, which isn't a normal SPI pin, and only listed as a cs1. I see in XPS that MIO0 can be mapped as a GPIO, and maybe it can connect that way? Or maybe you can find another way to map it to the IRQ directly in the MIO setup.

    Personally, I'd use one of the PL Pmods that I can wire the way I want using the EMIO. But maybe you can figure out this last pin?

    -Larry

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Looking more at the Maxim Pmod implementation, I now note they do not use the MIO or EMIO for anything other than a single UART for communication (over the USB).

    Rather than route the SPI through the MIO or EMIO, it's routed through the General Purpose Master AXI Interface, with the lines defined to have SPI properties.

    Therefore, the MIO on JE doesn't work for the Maxim Pmods, as the Maxim Pmods only work on the PL side, with Pmod connectors JA, JB, JC, and JD. The MIO connected to JE is not used as it's too difficult to reconfigure depending on the module, which is best done with Verilog HDL in the PL logic side.

    The point is that the GP Master AXI Interface may be the best way to configure this SPI interface as well, through one of the Pmods (JA, JB, JC, JD) connected to the PL side.

    Alternatively, defining GP ports on the MIO pins connecting to JE, with software redefinition as suggested by kbarlee, could be another way to go if you're willing to do the line configuratiosn on the software PS side instead of the Verilog PL side.  It could be you only need to reconfigure the IRQ on JE7 in software as the other pins look OK. (Hmmm, are mosi and miso reversed for the PMOD viewpoint?)

    Furthermore, I just now noted the PMOD pin 1 for the CC3000 is ss0 or chip select enable, and connects to PS_MIO13 on the Zynq chip. However, you look to be manipulating PS_MIO14 (or ss[1]) instead of MIO13 (or ss[0]) that's actually connected to the PMOD on pin 1. This is an easy fix, connecting the IRQ is another matter.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Thank you for your helpful replies!

    Hello Kenny,
    Writing my own SPI implementation to work via GPIO would be a practicable solution. Thanks for the input! I will resort to this if I cannot find a different solution.

    Hello Larry,
    I am controlling the CS signal of the CC3000 via GPIO, because of this problem with ss[0]: http://www.xilinx.com/support/answers/47511.htm. I have connected IRQ and PWR_EN the same way and both are working as intended. I can initialize the CC3000 by setting CS and then PWR_EN high and it reacts as intended by pulling IRQ low, which is captured by an GPIO interrupt.

    The real problem is that the registers cannot be read correctly. This manifests in the following symptoms:
    a) The XGpioPs_SelfTest fails at the first register read.
    b) When not performing the SelfTest and transmitting data, the status register reads 0x2, which cannot be right, comes up as all 0s on the memory monitor and the TX fifo empty flag is never set (or read).

    My suspicion is that there is something wrong with the configuration of my hardware system, since my software is almost identical to the Xilinx examples and the problem is something with the registers, as described above. Also the docu of the self test function says it's there to check for errors in the hardware build.

    I'd prefer to connect the Adapter to the PS, not the PL. I'm a bit under time pressure and not yet worked with Xilinx' FPGA tools (except for creating purely PS-based hardware systems).

    Thank you both a lot for your replies!

    Regards,
    Darius

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Thanks for the link to AR47511. Very interesting. Looks like you're not using the suggested fix of connecting SS0 to EMIO instead of MIO, needed to tie the input side of SS0 to Vcc to prevent unwanted SPI interrupts. I gather you're instead bypassing that connection altogether by using an GPIO, which seems to be a good work around. Yet you're using the rest of the SPI interface. Doesn't that article say you'll still have interrupt reset and hang up problems using the SPI controller as long as that SS0 input isn't tied high (through the EMIO patch)? Do you do that?

    I realized I left out the PWR_EN pin in my table above. So for future reference, I complete it below. From the schematic for the CC3000-Pmod, schematic for the FPGA on the Zedboard,and the MIO's pin definitions,I get the following line assignments:

    CC3000 Pmod pin; JE pin; FPGA pin; MIO Pin using SP1
    SPI_CS ; JE1 ; A6 ; PS_MIO13 ; ss0
    SPI_DI ; JE2 ; G7 ; PS_MIO10 ; mosi
    SPI_DO ; JE3 ; B4 ; PS_MIO11 ; miso
    SPI_CLK ; JE4 ; C5 ; PS_MIO12 ; ck
    SPI_IRQ ; JE7 ; G6 ; PS_MIO0 ; ???
    PWR_EN ; JE10 ; E6 : PS_MIO15; ss2

    I understand you're connecting three of the lines, CS (or SS0), IRQ, and PWR_EN by GPIO routing instead, and mapping those signals back into the SPI controller on the software driver side.

    I suspect that you're getting close. It seems you only have one snag but a lot of other things are working.

    At this point it's trial and error with the system you've got in hand, and not getting stuck into one mode of thinking, and look around other places. One time I had a UART interface I spent a week on debugging, thinking I had a wrong protocol. I finally found a wire was crossed. I had double checked the connection early on, but a tech had also crossed wires in the test cable I used to check! Things like that drive you nuts, but it taught me to don't fixate on one thing. Go back to the beginning and triple check absolutely everything carefully.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    You are right, Larry. I have not yet bound the ss[0] signal to vcc. This could definitively be the problem! I cannot figure out how to connect it to vcc, though.
    I have routed it to the EMIO, but I don't know where to go from there. Can you give me hint how this is done in Vivado?

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to Former Member

    Darius,

    The way to connect SS input to VCC is indicated in step 2 of the link you provided. (You already did step 1 in routing to EMIO.) You need to edit the hardware description *.mhs file with a simple text editor. Just double click on it in your project tree. Make a backup before adding the lines below. If you corrupt this file, it won't open your project. (Guess how I know.)

    From http://www.xilinx.com/support/answers/47511.htm :

    When interfacing via MIO or EMIO:

    1. Do not enable the SPI SS0 signal on any of the MIO pins.

    2. Configure the EMIO SPI SS0 port signal in the MHS file so its an output and the SS input is tied to net_vcc:

        PORT processing_system7_0_SPI0_SS_O_pin = processing_system7_0_SPI0_SS_O, DIR = O
        PORT SPI0_SS_O = processing_system7_0_SPI0_SS_O
        PORT SPI0_SS_I = net_vcc

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to Former Member

    Oh, and check to make sure the above example MHS entry is the right syntax name for that SPI0 port as you created in your system.

    Also check that the SS0 input and output are not already defined somewhere else in the MHS file before making a new entry. If so, just edit the existing entry instead.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to Former Member

    Thanks for the thorough explanation, but I'm using Vivado 2013.2, which does not have an MHS file in the project directory.

    I found one under C:XilinxVivado2013.2ids_liteISEdatazynqconfigps7_internalsps7_instance.mhs, but it says that it's the "Manually created PS7 Internal peripherals for ps7 instance mhs generation". I can't find any generated mhs files, except in ISE projects, which leads me to the conclusion that Vivado doesn't use MHS files.

    I guess I'll switch back to ISE and report back.

    Thank you very much for all your help, Larry!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Hi, I'm having the same problem. So I was wondering if you managed to solve this issue?
    I was originally using Vivado but changed to PlanAhead so that I could edit the MHS file.
    I used the default Zynq 702 board settings, removed all peripherals except the SD, UART and SPI0. Then I edited the MHS file according and generated the hardware file.
    In my software, the SPI status register is still 0x02. If you managed to get it to work, could you please tell me if you did anything differently?
    Thanks.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
>
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube