Setting up the I2S DMA transfer with interrupt was not that straightforward, the datasheet is a little bit "tight-lipped" :-) ...and the official ASF example isn't commented good enough...
So my findings:
I started with the I2S example from the ASF 3.35.1 using Atmel Studio 7
In my opinion it works as expected, but You should be aware of some rules:
- You should use the second PDC channel if you are using only one PDC! That is reffered as the right channel in the datasheet: (0x200–0x224 Reserved for PDC registers for right side) page:874
- The TXRDY interrupt also works, but the interrupt should be disabled immediately in the Interrupt service function, and reenabled after the next PDC transfer has been configured and enabled.
ATMEL freaks post: https://community.atmel.com/forum/samg55-i2s-dmapdc-endtx-interrupt-issue#comment-2327756
The original ASF example modified for mono transfer only:
#include <asf.h>
#include <conf_test.h>
#include <string.h>
#define SOUND_SAMPLES 0x100
int16_t output_samples_left[SOUND_SAMPLES] = {
0x7F, 0x7F, 0x7D, 0x7E, 0x7D, 0x7E, 0x7D, 0x7E,
0x7D, 0x7D, 0x7D, 0x7F, 0x7E, 0x7D, 0x7E, 0x7D,
0x7D, 0x7D, 0x7C, 0x7A, 0x7B, 0x7C, 0x7A, 0x7A,
0x7C, 0x7B, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80,
0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84,
0x86, 0x83, 0x81, 0x81, 0x83, 0x83, 0x83, 0x84,
0x82, 0x84, 0x84, 0x83, 0x85, 0x85, 0x82, 0x83,
0x82, 0x82, 0x82, 0x82, 0x7F, 0x80, 0x81, 0x7E,
0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E,
0x7C, 0x7E, 0x7E, 0x7F, 0x7F, 0x7D, 0x7D, 0x7C,
0x7D, 0x7D, 0x7D, 0x7B, 0x7C, 0x7B, 0x7C, 0x7D,
0x7E, 0x7E, 0x7F, 0x7E, 0x7D, 0x7F, 0x7E, 0x7D,
0x7D, 0x7B, 0x7D, 0x7D, 0x7E, 0x7D, 0x7D, 0x7E,
0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7C, 0x7E, 0x7E,
0x7F, 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x81,
0x7F, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81,
0x82, 0x81, 0x82, 0x82, 0x81, 0x80, 0x7F, 0x80,
0x7F, 0x7F, 0x7E, 0x80, 0x81, 0x82, 0x83, 0x82,
0x83, 0x84, 0x81, 0x82, 0x82, 0x81, 0x82, 0x81,
0x80, 0x80, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x81, 0x80,
0x80, 0x7F, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x7E,
0x7E, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7F,
0x80, 0x80, 0x81, 0x7E, 0x7F, 0x80, 0x7E, 0x7E,
0x7E, 0x7F, 0x7E, 0x7E, 0x7E, 0x7C, 0x7D, 0x7C,
0x81, 0x7D, 0x7C, 0x7C, 0x7B, 0x7D, 0x7C, 0x7D,
0x7D, 0x7D, 0x7B, 0x7D, 0x80, 0x80, 0x82, 0x80,
0x7F, 0x80, 0x83, 0x82, 0x80, 0x82, 0x84, 0x86,
0x86, 0x84, 0x84, 0x86, 0x87, 0x84, 0x85, 0x85,
0x85, 0x85, 0x86, 0x85, 0x85, 0x84, 0x83, 0x80,
0x81, 0x82, 0x83, 0x7F, 0x7E, 0x7F, 0x7F, 0x80,
0x7E, 0x7E, 0x7E, 0x7C, 0x7C, 0x7D, 0x7D, 0x7C
};
int16_t output_samples_right[SOUND_SAMPLES] = {
0x5A, 0x7F, 0x7D, 0x7E, 0x7D, 0x7E, 0x7D, 0x7E,
0x7D, 0x7D, 0x7D, 0x7F, 0x7E, 0x7D, 0x7E, 0x7D,
0x7D, 0x7D, 0x7C, 0x7A, 0x7B, 0x7C, 0x7A, 0x7A,
0x7C, 0x7B, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80,
0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84,
0x86, 0x83, 0x81, 0x81, 0x83, 0x83, 0x83, 0x84,
0x82, 0x84, 0x84, 0x83, 0x85, 0x85, 0x82, 0x83,
0x82, 0x82, 0x82, 0x82, 0x7F, 0x80, 0x81, 0x7E,
0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E,
0x7C, 0x7E, 0x7E, 0x7F, 0x7F, 0x7D, 0x7D, 0x7C,
0x7D, 0x7D, 0x7D, 0x7B, 0x7C, 0x7B, 0x7C, 0x7D,
0x7E, 0x7E, 0x7F, 0x7E, 0x7D, 0x7F, 0x7E, 0x7D,
0x7D, 0x7B, 0x7D, 0x7D, 0x7E, 0x7D, 0x7D, 0x7E,
0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7C, 0x7E, 0x7E,
0x7F, 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x81,
0x7F, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81,
0x82, 0x81, 0x82, 0x82, 0x81, 0x80, 0x7F, 0x80,
0x7F, 0x7F, 0x7E, 0x80, 0x81, 0x82, 0x83, 0x82,
0x83, 0x84, 0x81, 0x82, 0x82, 0x81, 0x82, 0x81,
0x80, 0x80, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x81, 0x80,
0x80, 0x7F, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x7E,
0x7E, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7F,
0x80, 0x80, 0x81, 0x7E, 0x7F, 0x80, 0x7E, 0x7E,
0x7E, 0x7F, 0x7E, 0x7E, 0x7E, 0x7C, 0x7D, 0x7C,
0x81, 0x7D, 0x7C, 0x7C, 0x7B, 0x7D, 0x7C, 0x7D,
0x7D, 0x7D, 0x7B, 0x7D, 0x80, 0x80, 0x82...
Read more »
I want an easy way to test the product after it is assembled and NOT have assembly technicians use a debugger on the assembly line. Inserting a USB cable and looking for a CR response (as with SAM-BA) is easy to do with the Atmel E70. Don't know why Atmel didn't add USB to the bootloader code! Also the 10 pin SWD connector adds cost when already have USB!
Hope you add the schematic soon. Need to see if I am on the right track! Thanks!