Hi
I’m new to BB but not new to hardware/software engineering. My reason for posting is that I am struggling to connect it to the Beaglebone in a way that permits fast data capture, and I am hoping that someone might be able to offer suggestions.
My (hobby) idea is to create a device that can read 6 to 8 channel audio and use sonar data analysis such as audio beamforming to analyse environmental sound, in the first instance to identify the direction sounds are coming from: https://en.wikipedia.org/wiki/Acoustic_source_localization
I have been looking to use a high-speed ADC such as the £12 AD7761 - an 8 channel, 16-bit true simultaneous sampling converter capable of 100HKz sampling, which uses SPI for device control but a much simpler serial data channel (using 1, 2 or 8 lines) for the analog samples. The max audio data rate is thus approx 12MBits/s sustained (96KHz sample rate). However, each 16-bit sample on the 7761 is output as a 24-bit value, with the 8 additional bits including channel/sample metadata. Thus the device-level data rate is around 18.5MBits/s for all 8 channels. The recommended Data I/O clock rate for the device is, however, 32.6MHz. Although it will work slower, there are impacts elsewhere.
The device has 8 serial output data lines and a sync line indicating start of the 24-bit data frame on the data lines. The next sample (either next channel or next in time, depending on configured # channels and outputs) follows on immediately. The device can either interleave all sample data on 1 line, split it across 2 lines, or use 1 dedicated line per channel. Byte-parallel output is not possible.
Something like:
DS ____---__
Ch1 ____XyyyyyXyyyyyXyy
…
ChN ____XyyyyyXyyyyyXyy
X=first bit of frame, y=other bits in frame.
Ideally I was hoping that I could use a PRU to read the data stream, so that the host ARM-8 could be left running the analysis software in peace. The analysis will involve performing continuous FFTs or similar so the A8 won’t be idle! Ideally the PRU will move the channel data into pre-allocated host memory buffers, one buffer per channel, so that the host can do its stuff. I’m thinking something like a DMA-based Ethernet chip works.
Initially I hoped to use the GPIO pins for serial or byte-parallel input:
-
I don’t think even a PRU can ‘bit-bang’ the port fast enough to work at even 20MHz, let alone 32MHz.
-
I cannot see a way of using the 28-bit serial input(s) on the BB: the pin seems to be in use by the BB, and even if available, how can I only grab 24 bit not 28 bit data, and take note of the DS line? Very curious as to why this port is not 32 bit and triggered more flexibly.
-
Byte-parallel input would help with data rate issues but I cannot seem to find a group of 8 sequential pins on the same PRU input port other than the LCD pins, which seem to be needed for HDMI output. If that could be sorted at one point I was thinking of reading 4 bytes of 6 bits at a time and using the 2 bits per byte as a counter, so as to ensure the PRU remains in sync with the stream. I would much prefer not to, but HDMI/LCD could be sacrificed.
-
I looked at using a dedicated chip: of these the 74HC673 16-bit serial-parallel converter looked very helpful, but I wasn’t sure how to read 16-bits then 8 bits at a time and retain sync, and again, which 16 lines can be read by a single 16-bit PRU read?
-
I looked into FPGA use, and still think that would probably work and may even offer some real advantages, but the assembled LOGI-bone uses an obsolete FPGA and is expensive, the LOGI-bone 2 is even more so, and though a cheap 44-pin FPGA is not, there is still quite a bit of faff getting it connected and programmed. If an FPGA were the answer I would like to implement a small (8-word?) FIFO in it, but otherwise it’s job would mainly be to interface the ADC to the Sitara.
-
I keep wondering about SPI, but I need one Sitara SPI channel for the ADCs own use of SPI and I know the BB uses one Sitara SPI channel itself; I think that leaves one channel left. Could the BB SPI (even if I can convert the data stream properly) handle data at ~ 20Mbits/sec including protocol overheads?
Any thoughts/advice gratefully accepted!
Ruth