<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to SPI</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/</link><description>Recent changes to SPI</description><language>en</language><lastBuildDate>Fri, 03 Jan 2020 13:04:34 -0000</lastBuildDate><atom:link href="https://forge.codesys.com/drv/io-drivers/doc/SPI/feed" rel="self" type="application/rss+xml"></atom:link><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#38f4</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Thanks for confirming the code.  Knowing the code is good forced me to look in a new direction.   The python line of code &lt;span&gt;[spi.open(0,1)]&lt;/span&gt; was the area I needed to focus on.  I read some website that said spi.open(0,1)  meant open port 0 in mode 1.  Then I found out it meant open port 0 using device 1.  I changed the settings in the SPI master on the in the device parameters.  I put as spidev0.1 instead of spidev0.0.  Then everything started to work.&lt;/p&gt;
&lt;p&gt;Thanks for the help!&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Fri, 03 Jan 2020 13:04:34 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com7f581f9881a31514360da8ac1a5563fca8cc7b07</guid></item><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#a484</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;I figured out the problem with communicating over the SPI bus.  &lt;/p&gt;
&lt;p&gt;I though this line of code in Python &lt;span&gt;[spi.open(0,1) ]&lt;/span&gt; meant open port 0 in mode 1.   I found out that this actually means  open port 0, device 1.  In the SPI master device I needed to replace the value in the SPI Port parameter from '/dev/spidev0.0' with '/dev/spidev0.1'.  Once I did this everything started working.  I am moving on to complete the driver.  &lt;/p&gt;
&lt;p&gt;Thanks for your help,  confirming the code told me to look in a new direction.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Thu, 02 Jan 2020 04:32:42 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com7fb01a6bbc773ff769fe75e7eadbcbb943341623</guid></item><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#fc41</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Your code looks good. I expect, that you are missing some init code. Did you already try "strace" on your python script?&lt;/p&gt;
&lt;p&gt;I would either try strace or a python debugger to get a better understanding of the python code.&lt;/p&gt;
&lt;p&gt;In CODESYS you can't do much wrong. Except that you might have the wrong device or frequency configured in the SPI master of your project.&lt;/p&gt;
&lt;p&gt;Especially the frequency can be important, as on some raspbian versions, the highest possible frequency was  not limited correctly. Therefore you need to configure it in the SPI master device in your CODESYS project. (Took me some hours once ;) )&lt;/p&gt;
&lt;p&gt;But you don't need to open anything. This is done by the SPI master already.&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Wed, 01 Jan 2020 07:54:58 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comd774358ef3d15416639f224532c5f271478fc95c</guid></item><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#c5a9</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;I am having trouble writing to the SPI bus.&lt;/p&gt;
&lt;p&gt;I have a python script I am trying to translate to codesys.   &lt;/p&gt;
&lt;p&gt;SPI Master settings in codesys:&lt;/p&gt;
&lt;p&gt;Max Hz 500000&lt;br/&gt;
bits per word is 8&lt;br/&gt;
port mode is 1&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;Python&lt;/span&gt;

   &lt;span class="nv"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
   &lt;span class="nv"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x12&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;Toggle&lt;/span&gt; &lt;span class="nv"&gt;Relay&lt;/span&gt;
   &lt;span class="nb"&gt;param1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;Relay&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="nb"&gt;param2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;setmode&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;BCM&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;RELAYbaseADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="nv"&gt;ppFRAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="nv"&gt;ppINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;setup&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ppFRAME&lt;/span&gt;,&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;OUT&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; 
&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ppFRAME&lt;/span&gt;,&lt;span class="nv"&gt;False&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;  #&lt;span class="nv"&gt;Initialize&lt;/span&gt; &lt;span class="nv"&gt;FRAME&lt;/span&gt; &lt;span class="nv"&gt;signa&lt;/span&gt;
&lt;span class="nv"&gt;time&lt;/span&gt;.&lt;span class="nv"&gt;sleep&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;.&lt;span class="mi"&gt;001&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;            #&lt;span class="nv"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;Pi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Plate&lt;/span&gt; &lt;span class="nv"&gt;reset&lt;/span&gt; &lt;span class="nv"&gt;SPI&lt;/span&gt; &lt;span class="nv"&gt;engine&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;necessary&lt;/span&gt;
&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;setup&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ppINT&lt;/span&gt;, &lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;IN&lt;/span&gt;, &lt;span class="nv"&gt;pull_up_down&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;PUD_UP&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;spi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;spidev&lt;/span&gt;.&lt;span class="nv"&gt;SpiDev&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;
&lt;span class="nv"&gt;spi&lt;/span&gt;.&lt;span class="nv"&gt;open&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;   
&lt;span class="nv"&gt;localPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;site&lt;/span&gt;.&lt;span class="nv"&gt;getsitepackages&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;]
&lt;span class="nv"&gt;RPversion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;.&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nv"&gt;ppCMDr&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="nv"&gt;cmd&lt;/span&gt;,&lt;span class="nb"&gt;param1&lt;/span&gt;,&lt;span class="nb"&gt;param2&lt;/span&gt;,&lt;span class="nv"&gt;bytes2return&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;:
    &lt;span class="nv"&gt;global&lt;/span&gt; &lt;span class="nv"&gt;RELAYbaseADDR&lt;/span&gt;
    &lt;span class="nv"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;
    &lt;span class="nv"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; []
    &lt;span class="nv"&gt;arg&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;RELAYbaseADDR&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;arg&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;arg&lt;/span&gt;[&lt;span class="mi"&gt;2&lt;/span&gt;]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;param1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;arg&lt;/span&gt;[&lt;span class="mi"&gt;3&lt;/span&gt;]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;param2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ppFRAME&lt;/span&gt;,&lt;span class="nv"&gt;True&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;spi&lt;/span&gt;.&lt;span class="nv"&gt;xfer&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;,&lt;span class="mi"&gt;300000&lt;/span&gt;,&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    #&lt;span class="nv"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;spi&lt;/span&gt;.&lt;span class="nv"&gt;writebytes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;bytes2return&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;:
        &lt;span class="nv"&gt;time&lt;/span&gt;.&lt;span class="nv"&gt;sleep&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;.&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="nv"&gt;bytes2return&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;: 
            &lt;span class="nv"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;spi&lt;/span&gt;.&lt;span class="nv"&gt;xfer&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;[&lt;span class="mi"&gt;00&lt;/span&gt;],&lt;span class="mi"&gt;500000&lt;/span&gt;,&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;resp&lt;/span&gt;.&lt;span class="nv"&gt;append&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dummy&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;]&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;time&lt;/span&gt;.&lt;span class="nv"&gt;sleep&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;.&lt;span class="mi"&gt;001&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;GPIO&lt;/span&gt;.&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ppFRAME&lt;/span&gt;,&lt;span class="nv"&gt;False&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;time&lt;/span&gt;.&lt;span class="nv"&gt;sleep&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;.&lt;span class="mi"&gt;001&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;resp&lt;/span&gt;   


&lt;span class="nv"&gt;def&lt;/span&gt; &lt;span class="nv"&gt;relayTOGGLE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="nv"&gt;relay&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;:
    &lt;span class="nv"&gt;VerifyADDR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;VerifyRELAY&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;relay&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;ppCMDr&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x12&lt;/span&gt;,&lt;span class="nv"&gt;relay&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;   





   &lt;span class="nv"&gt;Codesys&lt;/span&gt; 
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Inside&lt;/span&gt; &lt;span class="nv"&gt;Method&lt;/span&gt; &lt;span class="nv"&gt;AfterReadInputs&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;iAddress&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;


   &lt;span class="nv"&gt;ppFRAME&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;aby&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;iAddress&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;Relay_Base_Address&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;aby&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="sc"&gt;#12&lt;/span&gt;&lt;span class="c1"&gt;; //Toggle Relay&lt;/span&gt;
                    &lt;span class="nv"&gt;aby&lt;/span&gt;[&lt;span class="mi"&gt;2&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;aby&lt;/span&gt;[&lt;span class="mi"&gt;3&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;


                 &lt;span class="nv"&gt;transferEXT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pabyTxBuffer&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aby&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; , &lt;span class="nv"&gt;pabyRxBuffer&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aby&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; , &lt;span class="nv"&gt;udiLen&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; , &lt;span class="nv"&gt;uiDelayus&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;,&lt;span class="nv"&gt;udiSpeedHz&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;ppFRAME&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It seems to transfer with no errors, but nothing happens.&lt;br/&gt;
If I run the code in python then everything works.  I can toggle the relay on and off with the following code.&lt;/p&gt;
&lt;p&gt;import piplates.RELAYplate as RELAY&lt;br/&gt;
import time&lt;br/&gt;
RELAY.relayTOGGLE(0,1)&lt;/p&gt;
&lt;p&gt;Do I need to open the spi port?  Is there something more that I need to do?&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Tue, 31 Dec 2019 21:13:56 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comcf7ea052b50c907d02a2ff74bf0801d932e2bab6</guid></item><item><title>SPI modified by Ingo</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Sat, 30 Nov 2019 22:04:44 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.combc8351bf4d770e4a63281e81842a4a2f2ca58315</guid></item><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#ea63/863e</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Thanks for the report!&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Sat, 30 Nov 2019 06:45:01 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com4a6b0d868f9ccf54ea9d1210071f2c324545c344</guid></item><item><title>SPI modified by Ingo</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -272,7 +272,7 @@
 You might have noticed the few lines above:

 ~~~
-       by[0] := 1;
+       aby[0] := 1;
        aby[1] := 16#80 + SHL(usiChannel AND 7, 4);
        aby[2] := 0;
        aby[3] := 0;
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Sat, 30 Nov 2019 06:43:35 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comdf61d1440c9a9c49973dbc781f8929322673f754</guid></item><item><title>Discussion for SPI page</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/?limit=25#ea63</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Suggested Edit:&lt;/p&gt;
&lt;p&gt;SPI Transfer&lt;/p&gt;
&lt;p&gt;You might have noticed the few lines above:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;aby&lt;span&gt;[0]&lt;/span&gt; := 1; &amp;lt;&amp;lt;&lt;br/&gt;
        aby&lt;span&gt;[1]&lt;/span&gt; := 16#80 + SHL(usiChannel AND 7, 4);&lt;br/&gt;
        aby&lt;span&gt;[2]&lt;/span&gt; := 0;&lt;br/&gt;
        aby&lt;span&gt;[3]&lt;/span&gt; := 0;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;transfer&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pabyTxBuffer&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aby&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; , &lt;span class="nv"&gt;pabyRxBuffer&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;aby&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; , &lt;span class="nv"&gt;udiLen&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; , &lt;span class="nv"&gt;uiDelayus&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
        &lt;span class="nv"&gt;_iState&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 30 Nov 2019 03:28:03 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comf3311ab3dc55e1606daccb33a9cdc967c83202ad</guid></item><item><title>SPI modified by Ingo</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -267,6 +267,27 @@
 END_IF
 ~~~

+## SPI Transfer
+
+You might have noticed the few lines above:
+
+~~~
+       by[0] := 1;
+       aby[1] := 16#80 + SHL(usiChannel AND 7, 4);
+       aby[2] := 0;
+       aby[3] := 0;
+       
+       IF NOT transfer(pabyTxBuffer:=ADR(aby) , pabyRxBuffer:=ADR(aby) , udiLen:=3 , uiDelayus:=0) THEN
+           _iState := 1000;
+       END_IF
+~~~
+
+In SPI you always have to write out the same number of bytes, which you plan to receive. The method "transfer" is actually doing the transfer on the SPI bus. The addressing code is stolen from the MCP3008 chip. There you have one start bit (in bytes 0), and then a "command", which defines the ADC we want to read.
+
+For more informations about the MCP3008, you may check out these pages from [Adafruit](https://learn.adafruit.com/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi/script).
+
+As the data is shifted out on the SPI bus, and then received, you can use the same buffer for transmit and receive (like we did in the example above).
+
 ## Project Information

 In the "Project Information" you have to enter few names and identifiers:
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Wed, 14 Feb 2018 14:24:12 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com7482f33191d9a043ae248c1a8940d8c4bff362e1</guid></item><item><title>SPI modified by Ingo</title><link>https://forge.codesys.com/drv/io-drivers/doc/SPI/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -6,7 +6,7 @@
 This documentation describes the process of creating an own SPI driver for CODESYS, based on the SPI Template, which can be found in the [Code Repository](/drv/io-drivers/code). The driver consists of a "Device Description" as well as a CODESYS Library. All essential settings in the Library or the Device Description are repeated in this documentation. For more detailed informations about the Device Descriptions, please check the [general I/O driver documentation](General).

 # Device Description
-You can use a copy of the Device Description "SPI_Template.devdesc.xml" as a starting point. You need to adapt the following sections of the device description for your needs.
+You can use a copy of the Device Description [SPI_Template.devdesc.xml](/drv/io-drivers/code/HEAD/tree/trunk/SPI_Template.devdesc.xml) as a starting point. You need to adapt the following sections of the device description for your needs.

 ## Device Identification

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ingo</dc:creator><pubDate>Wed, 24 Jan 2018 12:31:34 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com3cf5b906a93199dcaf72d10f6843cbd608123702</guid></item></channel></rss>