>
> *I do this all with a JTAG emulator. Not sure how you will be able to
> debug this code otherwise*
>

If you're speaking of debugging PRU code. You can emulate the PRU code from
userland C with /dev/mem/, and mmap() until the code works properly, then
do the same thing on the PRU's.

On Sun, Nov 1, 2015 at 5:30 PM, John Syne <john3...@gmail.com> wrote:

> Hi Micka,
>
> With a few tweaks, you can use the drivers from Staterware[1] and use the
> PRU C compiler. My advice is to use Starterware on the CortexA8 to get
> familiar with the examples, utilities and driver code. Next you want to
> pull out just the driver and utility code you need and put it into one
> file, compile with the PRU C compiler and fix errors and warnings. Don’t
> forget to add CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;[2] to the start of
> main().
>
> I do this all with a JTAG emulator. Not sure how you will be able to debug
> this code otherwise.
>
> [1] http://www.ti.com/tool/starterware-sitara
> [2] https://git.ti.com/pru-software-support-package
>
>
> Regards,
> John
>
>
>
>
> On Nov 1, 2015, at 4:06 PM, William Hermans <yyrk...@gmail.com> wrote:
>
> By the way, I keep seeing stuff like "C2" in PASM assembly in regard to
> the PRU's. Wish I could figure out what it is . . . Seems to be some sort
> of constant "register" ? And there is more than just C2, but I have not
> found any reference to those yet :/
>
> On Sun, Nov 1, 2015 at 5:01 PM, William Hermans <yyrk...@gmail.com> wrote:
>
>> Hi Micka,
>>
>> I do not think he is using and driver. When speaking of the I2C module, I
>> believe hes speaking of the physical on chip module. But this . . .
>>
>> #define I2C1_BASE            C2                //base registri I2C1 nella
>> tabella
>>
>> translated from Italian to English  . . . *I2C1 base registers in the
>> table  *which seems to me he is setting up the I2C hardware module
>> directly through it's registers in memory. But the other link, he pasted I
>> do not know if you saw it or not
>> http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J
>> he talks about the problem being solved and he was not bringing the
>> hardware module out of reset, which is similar to how the ADC module works.
>>
>> Wish I could help you more, but I know nearly nothing about I2C. I know
>> what it is, and vaguely how it's done, but have never used I2C . . .
>>
>> On Sun, Nov 1, 2015 at 2:45 PM, Micka <mickamus...@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> I'm interested by what you have done.  I want to use i2c to read analog
>>> value from a component.
>>>
>>> The first solution that I found was to bitbang the i2c. But you, you use
>>> the i2c driver which is nice.
>>>
>>> Could you give us the peace of asm code that you use to interface with
>>> the MCP23017. And if you have the c code also it would be great.
>>>
>>> ( if possible, also the part of you managed to activate the module by
>>> writing MODULEMODE field into register CM_PER_I2C1_CLKCTRL register and
>>> also the code that wait for IDLEST field to confirm that module is ready).
>>>
>>> Micka,
>>>
>>> Le dim. 19 juil. 2015 21:45, Gianfranco Rosso <
>>> gianfranco.ro...@tiscali.it> a écrit :
>>>
>>> I've also posted this in I2C topic, the solution is there:
>>>
>>>
>>> http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J
>>>
>>>
>>> Il giorno lunedì 13 luglio 2015 09:49:20 UTC+2, Gianfranco Rosso ha
>>> scritto:
>>>
>>> I want to manage the I2C1 module by the PRU, in order to interface some
>>> I/O expanders (MCP23017 by Microchip).
>>> I use may own "cape" without the plug-n' play eeprom (one of the next
>>> steps will be adding management for DCAN0 and DCAN1 so i'll need these pins
>>> too...).
>>> So, at present, there are just 2 MCP23017 connected to the P9.17 and
>>> P9.18.
>>>
>>> I load the *cape-universal* into slots and then I use *configure-pin*
>>> command to set P9.17 and P9.18 as *i2c*
>>>
>>> I've started from an example into the *am335x_pru_package-master* and
>>> wrote my own C PRU loader.
>>> Very simple, it just:
>>>
>>> loads the PRU codeinit the data exhanged with the PRUstart the PRUwait
>>> for ESC key presssignal to the PRU to stopwait for the PRU stopexit.
>>>
>>>
>>> Also the assembly PRU code is simple:
>>>
>>> init I2C1 module (by writing registers PSC, SCLL, SCLH, CON)init 1st I/O
>>> expander as 16 inputs (even if at power on it's already set as input)init
>>> 2nd I/O expander as 16 outputscicle reading status of inputs from 1st
>>> expander and echoing to the outputs of 2nd expanderexit cycle and halt when
>>> receive stop flag from the loader
>>>
>>> for send and receive I2C messages I use register SA, CNT, DATA and CON.
>>>
>>> That's very simple and linear... pity, it doesn't work.
>>>
>>> *I didn't see any activity at all in P9.17 and P9.18*.
>>>
>>> The PRU code is surely running, as I add a cycle counter and show it in
>>> the loader while it's waiting for ESC keypress, and also the PRU code
>>> correctly stops at the loader command.
>>>
>>> I was expecting that the PRU code stalls if I2C bus doesn't work, as
>>> there are waiting cycles both for STOP condition or for CNT reaching zero
>>> (depending on the write or read message sending).
>>>
>>> But it seems running, and running very fast also: the cycle counter is
>>> incremented to a very fast rate (over 550 kcycles/s)  that's not compatible
>>> with the correct executing of I2C sequences (I've setted the module for
>>> 400Kbps rate... so the PRU cycle it's even faster than a single I2C bit
>>> time!).
>>>
>>> I'm surely doing something wrong, but I cant fugure what.
>>>
>>> Any idea?
>>>
>>> Suggestions?
>>>
>>> Inserisci qui il codice...
>>>
>>> .origin 0
>>> .entrypoint START
>>>
>>> #include "iic_ioexp.hp"
>>>
>>> //costanti per l'accesso al modulo I2C1
>>> #define I2C1_BASE            C2                //base registri I2C1
>>> nella tabella costanti
>>> #define I2C_SYSC            0x10            //offset del registro
>>> I2C_SYSC
>>> #define I2C_STAT_RAW        0x24            //offset del registro
>>> I2C_STATUS_RAW
>>> #define I2C_SYSS            0x90            //offset del registro
>>> I2C_SYSS
>>> #define I2C_CNT                0x98            //offset del registro
>>> I2C_CNT
>>> #define I2C_DATA            0x9C            //offset del registro
>>> I2C_DATA
>>> #define I2C_CON                0xA4            //offset del registro
>>> I2C_CON
>>> #define I2C_SA                0xAC            //offset del registro
>>> I2C_SA
>>> #define I2C_PSC                0xB0            //offset del registro
>>> I2C_PSC
>>> #define I2C_SCLL            0xB4            //offset del registro
>>> I2C_SCLL
>>> #define I2C_SCLH            0xB8            //offset del registro
>>> I2C_SCLH
>>>
>>> #define I2C_CMD_ENABLE        0x8400            //modulo I2C abilitato
>>> come master
>>> #define I2C_CMD_TX            0x0200            //modulo I2C in
>>> trasmissione
>>> #define I2C_CMD_RX            0x0000            //modulo I2C in ricezione
>>> #define I2C_CMD_START        0x0001            //modulo I2C richiesta
>>> generazione sequenza START
>>> #define I2C_CMD_STOP        0x0002            //modulo I2C richiesta
>>> generazione sequenza STOP
>>>
>>> //costanti per l'accesso all'I/O expander MCP23017
>>> #define IO_EXP0                0x20            //7bit I2C address
>>> dell'I/O expander 0 (ingressi)
>>> #define IO_EXP1                0x21            //7bit I2C address
>>> dell'I/O expander 1 (uscite)
>>>
>>> #define IO_EXP_IODIRA        0x00            //indirizzo registro IODIRA
>>> dell'I/O expander
>>> #define IO_EXP_GPIOA        0x12            //indirizzo registro GPIOA
>>> dell'I/O expander
>>>
>>> //======================================================================
>>>
>>> //macro che attende fine sequenza verificando generazione seqeunza di
>>> STOP
>>> .macro I2C_WAIT_BY_STOP
>>> _CHECK:
>>>     LBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>     QBBS _CHECK, r1.t1
>>> .endm
>>>
>>> //macro che attende fine sequenza verificando generazione seqeunza di
>>> STOP
>>> .macro I2C_WAIT_BY_COUNT
>>> _CHECK:
>>>     LBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>     QBNE _CHECK, r1.w0, 0
>>> .endm
>>>
>>> //======================================================================
>>>
>>> START:
>>>     // clear that bit
>>>     LBCO r0,
>>>
>>> on
>>>
>>> , 4, 4
>>>     CLR r0, r0, 4
>>>     SBCO r0, C4, 4, 4
>>>
>>>     //------------------------------------------------------------------
>>>     //configurazione modulo I2C1
>>>
>>>     //reset del modulo I2C1
>>>     MOV r1.w0, 0x0002
>>>     SBCO r1.w0, I2C1_BASE, I2C_SYSC, 2
>>>
>>>     MOV r1.w0, 0x0000
>>>     SBCO r1.w0, I2C1_BASE, I2C_SYSC, 2
>>>
>>> //    //attesa fine reset modulo
>>> //_WAIT_RDONE:
>>> //    LBCO r1, I2C1_BASE, I2C_SYSS, 4
>>> //    QBBC _WAIT_RDONE, r1.t0
>>>
>>>     //configura prescaler e durata SCL H/L per avere 400kHz
>>>     MOV r1.b0, 4                //prescaler=4+1 -->
>>> ICLK=SCLK/prescaler=100/5=20MHz (nel reference manual raccomandano circa
>>> 24Mhz)
>>>     SBCO r1.b0, I2C1_BASE, I2C_PSC, 1
>>>
>>>     MOV r1.b0, 18                //durata SCL L=18+7 -->
>>> tLOW=1/ICLK*(SCLL+7)=1/20E6*(18+7)=1.25us
>>>     SBCO r1.b0, I2C1_BASE, I2C_SCLL, 1
>>>
>>>     MOV r1.b0, 20                //durata SCL H=20+5 -->
>>> tHIGH=1/ICLK*(SCLH+5)=1/20E6*(20+5)=1.25us
>>>     SBCO r1.b0, I2C1_BASE, I2C_SCLH, 1
>>>
>>>     //abilita modulo
>>>     MOV r1.w0, I2C_CMD_ENABLE
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     //------------------------------------------------------------------
>>>     //inizializzazione IOEXP 0
>>>
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP0
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>>
>>>     //n. byte da spedire
>>>     MOV r1.w0, 3
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_IODIRA | 0x00FFFF00        //tutti i pin come
>>> ingressi (in realta' e' gia' cosi' dal POR)
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b1, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b2, I2C1_BASE, I2C_DATA, 1
>>>
>>>     //attesa bus free
>>> _WAIT_BB:
>>>     LBCO r1, I2C1_BASE, I2C_STAT_RAW, 4
>>>     QBBS _WAIT_BB, r1.t12
>>>
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     I2C_WAIT_BY_STOP
>>>
>>>     //------------------------------------------------------------------
>>>     //inizializzazione IOEXP 1
>>>
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP1
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>>
>>>     //n. byte da spedire gia' impostato
>>>
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_IODIRA | 0x00000000        //tutti pin come uscita
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b1, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b2, I2C1_BASE, I2C_DATA, 1
>>>
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     I2C_WAIT_BY_STOP
>>>
>>>     //------------------------------------------------------------------
>>>     //ciclo rinfresco I/O
>>>
>>> _LOOP:
>>>
>>>     //------------------------------------------------------------------
>>>     //legge ingressi
>>>
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP0
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>>
>>>     //n. byte da spedire
>>>     MOV r1.w0, 1
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_GPIOA
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1
>>>
>>>      //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     I2C_WAIT_BY_COUNT
>>>
>>>      //n. byte da ricevere
>>>     MOV r1.w0, 2
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>
>>>      //comando lettura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_RX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     I2C_WAIT_BY_STOP
>>>
>>>     //legge i byte ricevuti
>>>     LBCO r2.b1, I2C1_BASE, I2C_DATA, 1
>>>     LBCO r2.b2, I2C1_BASE, I2C_DATA, 1
>>>
>>>     //------------------------------------------------------------------
>>>     //scrive uscite
>>>
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP1
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>>
>>>     //n. byte da spedire
>>>     MOV r1.w0, 3
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>
>>>     //riempie FIFO
>>>     MOV r2.b0, IO_EXP_GPIOA
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1
>>>
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>
>>>     I2C_WAIT_BY_STOP
>>>
>>>     //------------------------------------------------------------------
>>>     LBCO r2, CONST_PRUDRAM, 0, 4
>>>     ADD r2, r2, 1
>>>     SBCO r2, CONST_PRUDRAM, 0, 4
>>>
>>>     //------------------------------------------------------------------
>>>     //esce dal ciclo e se il flag di uscita nella ram condivisa e'
>>> azzerato
>>>     LBCO r2, CONST_PRUDRAM, 4, 1
>>>     QBNE _LOOP, r2.b0, 0
>>>
>>> _EXIT:
>>>     //invia all'host la notifica di programma completato
>>>     MOV R31.b0, PRU0_ARM_INTERRUPT+16
>>>
>>>     HALT
>>>
>>>
>>> --
>>> For more options, visit http://beagleboard.org/discuss
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "BeagleBoard" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to beagleboard+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>>>
>>> --
>>> For more options, visit http://beagleboard.org/discuss
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "BeagleBoard" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to beagleboard+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>
> --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to beagleboard+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to beagleboard+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to