I am using a Beaglebone Black and C to read analog inputs with PRU0 and return the data to a host program using RPMSG.
Basically, I read the data from FIFO0 fine, strip the step id from it and copy it into an element of a character array in the PRU code.
Data = HWREG(SOC_ADC_TSC_0_REGS + TSC_ADC_SS_FIFODATA(0));
if ((Data & 0x000F0000) == 0) { // checking the step id tag for step 0
// if step == 0, strip off the step and put the data in array DetBSample
DetBSample[sampleno] = Data & 0xFFF;
memcpy(payload, “\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0”, 24); // this came from TI’s sample code, best I can tell it just preloads and end of string character in the whole string.
ltoa((long)DetBSample[sampleno], payload); // put the value in DetBSample[sampleno] in the character string payload
// now send the payload to the host
pru_rpmsg_send(&transport, dst, src, payload, 24);
This code compiles and runs fine.
On the host side, I do this when I’m kicked by the PRU. (This is a snippet so brackets may not match!)
/* Poll until we receive a message from the PRU and then print it */
result = read(pollfds[0].fd, readBuf, MAX_BUFFER_SIZE);
if (result > 0)
{
Volts = atof(readBuf)*ADC_Res;
printf(“Message %d received from PRU:%s or %x\n”, i, readBuf, readBuf);
printf(“Volts read: %.3f\n”,Volts);
The output is strange though (snippet below). The message #, string value of readBuf and Volts are all correct. But when I output readBug as hex, it never changes. I thought it might be the address of readBuf but it doesn’t appear to be.
The voltage matches the input we’re providing from a bench power supply and the decimal value is correct. It’s just that this hex value doesn’t change.
Message 97 received from PRU:3742 or 4b50b0
Volts read: 1.644
Message 98: Sent to PRU
Message 98 received from PRU:3744 or 4b50b0
Volts read: 1.645
Message 99: Sent to PRU
Message 99 received from PRU:3743 or 4b50b0
Volts read: 1.645
Received 100 messages, closing /dev/rpmsg_pru30