Mam s Atmelem velmi podobne zkusenosti. Pouzivam SAM7 a nekolik let mi trvalo nez jsem naprogramoval vsechny mozne workaroundy aby se dal vubec pouzivat.
Napriklad ten jejich ADC -- nejenze je spatne vymysleny a inicializovat ho tak aby pak bezel synchronne s CPU clockem a nemel vzhledem k nemu jitter je netrivialni, ale kdyz to clovek napise v assembleru a diky tomu do registru zapisuje prilis rychle po sobe a je vybran kanal 1 tak to pak na zacatku blbe zapina multiplexer a v dusledku toho nakonec misto <ch1> <ch2> <ch1> <ch2> vam DMA nacpe do pameti <?> <ch1> <ch2> <ch1> <ch2>, takze se hodnoty o 1 posunou coz je velmi prijemne napriklad pokud ch1 je napeti a ch2 proud. Staci dat na vhodne misto 2 NOPy a nedela to.
A mimochodem taky mi to neverili. Jsou to tak trochu amateri.
Pak jeste nekolik designovych nesmyslu: Treba zrovna to DMA (jimi zvane PDC) neni uplne spatne ale mohlo byt udelano lepe, kdyby ty prerusovaci bity po dojeti bufferu byly pro vsechny periferie na stejnem miste relativne k PDC registrum. Takhle kdyz napisu genericke rutiny pro DMA bufffer chaining tak jim nestaci jeden argument a totiz adresa te periferie -- jeste potrebuji adresu interrupt pending registru a dokonce i offset tech bitu protoze to ti blbci pro kazdou periferii udelali jinde.
Pak vubec to jejich mapovani periferii -- kazda potrebuje max 256 bytu (stacilo by jim dokonce 128), ale oni ji vyhradi 16KB. Jenze ARM7TDMI umi PC-relative adresovani jen +-4KB (a pointer-relative tez, pokud se misto PC pouzije jiny registr). Takze kdyby mezi registry periferii udelali rozestupy 256 bytu tak je vsechny nacpaly na adresy pobliz FFFFFF00, kam dosahnu z kodu ktery zacina na 0, kde mam vetsinou scheduler a obsluhu preruseni. Tak jak to udelali oni dosahnu jen na jednu periferii a pro ostatni si musim nejdriv naplnit registr adresou a pak ho pouzit (coz zbytecne snizuje hustotu kodu -- kdyz to dela gcc tak az 4*, kdyz to delam rucne v assembleru tak zhruba 2* ale ten program pak vypada celkem krypticky). Problem by to zmirnilo i v kodu dal od adresy 0, protoze by mi stacil jeden bazovy registr pro periferie a ne pro kazdou periferii novy.
Pak taky jsem zjistil ze seriova linka kdyz se dostane do stavu framing error tak aby se z nej dostala zaruzene ven tak potrebuje aby zdroj dat prestal na chvili (aspon 1 znak) vysilat. Coz trochu cloveku zkazi radost kdyz si udela chaining DMA, ktere pak dokaze krmit/prijimat nepretrzite.
Muzete prosim rozvest to shazovani CS u SPI? Je to to co pisou v errata, nebo me pripadne ceka jeste nejake prekvapeni?