Yeah that link John gave out seems good. I've been meaning to follow it myself for a couple weeks now. But I've been doing other things waiting for remoteproc / rpmsg to settle down.
I really like the idea of remoteproc / rpmsg, it seems very intuitive / natural. Also Micka, there is *some* github project that uses starterware too . . . demonstrating how to use starterware inside a ti_cgt C compiler project . . . I do not remember which it is, so may not be able to find a link to it . . . On Mon, Nov 2, 2015 at 8:37 AM, John Syne <john3...@gmail.com> wrote: > Hi Micka, > > Follow this tutorial: > > http://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs > > Regards, > John > > > > > On Nov 2, 2015, at 1:26 AM, Micka <mickamus...@gmail.com> wrote: > > Ok, the problem is that in a PRU project you don't have access to the I2C > function that you have in the starterware :'( . > > > I guess that I need to code in ASM then ^^ . > > Le lun. 2 nov. 2015 à 10:01, Micka <mickamus...@gmail.com> a écrit : > >> I found that : >> >> >> http://www.element14.com/community/community/designcenter/single-board-computers/next-gen_beaglebone//blog/2014/04/30/bbb--pru-c-compiler >> >> >> Le lun. 2 nov. 2015 à 09:48, Micka <mickamus...@gmail.com> a écrit : >> >>> Ok, thx for the tips. >>> >>> I've CCS & starterware installed. I found the I2C driver. But how do you >>> create a PRU project for the beaglebone black ? >>> >>> In the CCS App center, the PRU compiler is installed, but I can't find >>> how to create a PRU project ? >>> >>> >>> Micka, >>> >>> >>> Le lun. 2 nov. 2015 à 01:30, John Syne <john3...@gmail.com> a écrit : >>> >>>> 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. > > > -- > 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.