Le vendredi 19 septembre 2014 16:46:05 UTC-4, Cedric Malitte a écrit :
>
> Hi all,
>
> I had a few hours to play with the pruss, but I came to a dead end...
>
> My goal is to read ADCs, ADS8326 to be precise.
> It's a kind of SPI adc with one clock, one select, one out.
>
> I'd like to use 4 in parallel, which means only one clock, one select and
> 4 inputs on the PRUSS.
> I try to pull up CLK line and then read each input, shift them into
> variables to be sent to main app.
>
> When I look at the CLK line on a scope, it's taking way too much time to
> get input states and shift even if the asm code should only take a few
> cycles.
> I'm lazy, I write the pruss code in C, but asm looks nice.
>
> Here's the code in C
>
> #define ADC1 (1 << 14)
> #define ADC2 (1 << 15)
> #define ADC3 (1 << 16)
> #define ADC4 (1 << 17)
>
> #define SOC_GPIO_1_REGS (0x4804C000)
> #define SOC_GPIO_3_REGS (0x481AE000)
> #define GPIO_PIN_LOW (0x0)
> #define GPIO_PIN_HIGH (0x1)
>
> #define GPIO_CLEARDATAOUT (0x190)
> #define GPIO_SETDATAOUT (0x194)
> #define GPIO_DATAIN (0x138)
> #define GPIO_DATAOUT (0x13C)
> #define GPIO_OE (0x134)
>
> #define HWREG(x) (*((volatile unsigned int *)(x)))
>
> #define ADC_CLK_PIN 12
> #define ADC_CS_PIN 13
>
> #define ADC_CLK_HI (HWREG(SOC_GPIO_1_REGS + GPIO_SETDATAOUT) = (1 <<
> ADC_CLK_PIN))
> #define ADC_CLK_LOW (HWREG(SOC_GPIO_1_REGS + GPIO_CLEARDATAOUT) = (1 <<
> ADC_CLK_PIN))
>
> #define ADC_CS_HI (HWREG(SOC_GPIO_1_REGS + GPIO_SETDATAOUT) = (1 <<
> ADC_CS_PIN))
> #define ADC_CS_LOW (HWREG(SOC_GPIO_1_REGS + GPIO_CLEARDATAOUT) = (1 <<
> ADC_CS_PIN))
>
> #define PRU0_ARM_INTERRUPT 19
> #define SYSCFG (*(&C4+0x01))
> int C4 __attribute__((cregister("MEM",near),peripheral)); //only
> compatible with v1.1.0B1 +
> //add following lines to MEMORY{} in lnk.cmd
> //PAGE 2:
> // MEM : o = 0x00026000 l = 0x00002000 CREGISTER=4
> volatile register unsigned int __R31;
>
> void main()
> {
> /*Intialise OCP Master port for accessing external memories*/
> SYSCFG&=0xFFFFFFEF;
> ocp_init();
> shm_init();
> /*Start Main Code*/
> int i,j;
> unsigned int sensor_1=0, sensor_2=0, temp=0;
> HWREG(SOC_GPIO_1_REGS + GPIO_OE) &= ~(1 << ADC_CLK_PIN); // output
> HWREG(SOC_GPIO_1_REGS + GPIO_OE) &= ~(1 << ADC_CS_PIN); // output
> HWREG(SOC_GPIO_3_REGS + GPIO_OE) |= ADC1; // input
> HWREG(SOC_GPIO_3_REGS + GPIO_OE) |= ADC2; // input
> HWREG(SOC_GPIO_3_REGS + GPIO_OE) |= ADC3; // input
> HWREG(SOC_GPIO_3_REGS + GPIO_OE) |= ADC4; // input
> ADC_CLK_HI;
> DELAY1;
> while (1)
> {
> ADC_CLK_HI;
> __asm__ __volatile__
> (
> " NOP \n"
> " NOP \n"
> " NOP \n"
> " NOP \n"
> " NOP \n"
> );
> //READ
> sensor_1 |= (HWREG(SOC_GPIO_3_REGS + GPIO_DATAIN) & ADC1);
> sensor_1 |= ((HWREG(SOC_GPIO_3_REGS + GPIO_DATAIN) &
> ADC2)<<16);
> sensor_2 |= (HWREG(SOC_GPIO_3_REGS + GPIO_DATAIN) & ADC3);
> sensor_2 |= ((HWREG(SOC_GPIO_3_REGS + GPIO_DATAIN) &
> ADC4)<<16);
> ADC_CLK_LOW;
> if (j!=15)
> {
> // shift bits
> sensor_1 = sensor_1 << 1;
> sensor_2 = sensor_2 << 1;
> }
> delay_100();
> }
>
>
>
> Relevant part reading sensor_1 in asm:
>
> .dwpsn file "adc_pru.c",line 154,column 4,is_stmt,isa 0
> LDI r0, 0x4000 ; [] |154|
> LDI32 r1, 0x481ae138 ; [] |154|
> LBBO &r1, r1, 0, 4 ; [] |154|
> AND r0, r1, r0 ; [] |154|
> LBBO &r1, r2, 8, 4 ; [] |154| sensor_1
> OR r0, r1, r0 ; [] |154|
> SBBO &r0, r2, 8, 4 ; [] |154| sensor_1
>
> .dwpsn file "adc_pru.c",line 155,column 4,is_stmt,isa 0
> LDI r0, 0x8000 ; [] |155|
> LDI32 r1, 0x481ae138 ; [] |155|
> LBBO &r1, r1, 0, 4 ; [] |155|
> AND r0, r1, r0 ; [] |155|
> LSL r0, r0, 0x10 ; [] |155|
> LBBO &r1, r2, 8, 4 ; [] |155| sensor_1
> OR r0, r1, r0 ; [] |155|
> SBBO &r0, r2, 8, 4 ; [] |155| sensor_1
>
>
> My great trouble is that it takes to much time, in fact way too much.
>
> Using this code, the CLK line is at 757 Khz.
> CLK hi is around 1us and low is the rest....
>
> I'd like to achieve at least 2Mhz for CLK line.
>
> I might have misread the doc, but isn't an instruction supposed to be 5ns
> ?
> That should be 35ns for first part and 40ns for second part.
>
> Any clue or help ?
>
> The learning curve is a bit harder than I tought :)
>
> Thanks
>
>
Well I misread the doc.... not all instructions are created equal :)
Even that, it's still slow as hell to read the inputs...
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.