Pizza_Boom schreef op zaterdag 14 februari 2015 @ 20:45:
[...]
C en H file is bijgeleverd met HT Compiler 9.83, net als een master example. Daaruit heb ik de code. Maar dat is dus eigenlijk niet geheel handig voor iemand die I2C aan het aanleren is?
[...]
Dat durf ik eerlijk waar niet te zeggen. Daarvoor is mijn I2C kennis te basaal.
Dat ook weer niet, maar het is altijd beetje zoeken hoe je een I2C protocol naar code vertaald. Met losse registers zal dat nog moeilijker zijn. Grote taken kan je het beste opsplitsen in kleinere hapbare brokken, en een library gebruiken zal daar bij helpen.
Persoonlijk zie ik niet zo graag I2c ReadFrom() oid.. wat doet deze magische functie anders dan een byte op de bus zetten? Regelt het de read/not write bit voor mij? Schuift het het adres nog 1 op of niet?
[...]
Toch maar eens daarnaartoe werken dan. Alleen jammer dat de gedownloade file zo'n zooitje maakt van de code.
https://gist.github.com/nlhans/44fbbc8abdcdad7939c1
Fout afhandeling kan bvb zijn als een slave niet reageert, of een bus collision optreedt. Wat ga je dan doen - vrolijk doorpraten, of..
Ik heb wel eens tijden zitten zoeken waarom een ethernet webserver vast liep na loop van tijd. Bleek dat de SPI peripheral om een of andere reden een overflow kreeg en daardoor vast stond. Ik had de code zo basaal mogelijk opgeschreven voor performance (want ethernet..), maar dat was dus iets te ver.
[...]
Voor zover ik heb gezien, heb ik zelf de I2C_Start in te voeren. Gezien het feit dat dit een redelijk recente chip is, in januari 2012 op de markt gebracht, ga ik ervan uit dat latere I2C functies wel worden ondersteund.
Ik zie dat de registers wel praten over restart voor masters. Dus het zou best kunnen dat de MSSP peripheral in I2C slave een restart conditie wel kan ontcijferen.
[...]
Heb ik aangepast, thanks!
[...]
Maar kunnen ze kwaad? Doe ze überhaupt wat is het gewoon een read as '0' gevalletje?
Het idee van I2C slave is dat jouw programma wacht op de master voor een transactie.
Dat is enkel ook nuttig als de master het juiste I2C adres aanspreekt. De MSSP doet dat al voor jouw, dus een belletje krijgen om elke I2C start/stop conditie op de bus is niet heel nuttig. Je kan ze gewoon negeren.. geen probleem, maar je zal in de interrupt nog een check moeten bouwen om te krijgen of je een start/stop afhandelt, of data. Ik heb gekozen dat niet te doen, dat bespaard weer een if lus en dus verwerk tijd.
Voor een master kan die interrupt wel handig zijn.. bvb als je de I2C master driver volledig in interrupts wilt laten werken.
Daarom koos ik voor de I2C slave wel interrupt op elke byte die ontvangen is, maar geen interrupt op start/stop. Je zal dan wel een interrupt routine moeten schrijven. Dat lijkt mij echter wel handig/vanzelfsprekend omdat een slave eigenlijk altijd aanspreekbaar moet zijn, maar tegelijk ook nog andere zaken moet doen.
[...]
Gebeurt dat niet dan met een I2C_ReadFrom(0xXX)?
Ik heb het momenteel zo geconfigureerd staan, kwam er alleen achter dat ik adres x01 niet mag gebruiken, omdat x00 en x01 intern gebruikt worden voor iets.
code:
1
2
3
4
| STAP3: i2c_ReadFrom(0x01); //geef slave 1 opdracht tot data sturen
data1 = i2c_GetByte(I2C_MORE); //lees byte 1 van slave1
data2 = i2c_GetByte(I2C_MORE); //lees byte 2 van slave1
data3 = i2c_GetByte(I2C_LAST); //lees byte 3 van slave1 en stop met lezen |
Ja aan de master kant zal je een restart moeten geven, en vervolgens bit 1 hoog zetten (read indicator voor de slave).
Dan kan je bytes gaan lezen uit de slave. Ik bedoel met strict te zeggen dat de MSSP peripheral gewoon dienst weigert als je niet de juiste modus gebruikt.
[...]
Die komt me erg bekend voor ja. Heb ik me al eens doorheen geworsteld. Ga ik nog maar eens doen.
Een LA is ook geen gek idee. Ik heb meteen mijn scope + decoder er aan gekoppeld om te zien wat er gebeurde en welke acknowledges over kwamen.