Moin,
ich bin gerade dabei einen I2C Bus zwischen dem Pi (Master) und zwei Attiny 2313 (Slave) aufzubauen.
Dazu habe ich als erstes eine 2 Kanal Pegelwandler gebaut nach dem Schaltplan.
Statt dem BSS138 habe ich den BS 170 verwendet.
Das ganze sieht dann so aus (ich hatte blos noch 1W 10k :D):
Und eine Schaltung nach dieser Anleitung aufgebaut.
Soweit so gut hat auch so funktioniert.
Jetzt zu meinen Problem:
Ich habe dann mit der Lib von der Seite experimentiert.
und die Main auf den Attiny 2313 geflasht
/*##############################################################################
Name : USI TWI Slave driver - I2C/TWI-EEPROM
Version : 1.3 - Stable
autor : Martin Junghans jtronics@gmx.de
page : www.jtronics.de
License : GNU General Public License
Created from Atmel source files for Application Note AVR312:
Using the USI Module as an I2C slave like a I2C-EEPROM.
//############################################################################*/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//################################################################## USI-TWI-I2C
#include "usiTwiSlave.h"
// Note: The LSB is the I2C r/w flag and must not be used for addressing!
#define SLAVE_ADDR_ATTINY 0b00110100
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
//####################################################################### Macros
#define uniq(LOW,HEIGHT) ((HEIGHT << 8)|LOW) // Create 16 bit number from two bytes
#define LOW_BYTE(x) (x & 0xff) // Get low byte from 16 bit number
#define HIGH_BYTE(x) ((x >> 8) & 0xff) // Get high byte from 16 bit number
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT))) // Set bit
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))// Clear bit
#define toggle(ADDRESS,BIT) ((ADDRESS) ^= (1<<BIT)) // Toggle bit
#define bis(ADDRESS,BIT) (ADDRESS & (1<<BIT)) // Is bit set?
#define bic(ADDRESS,BIT) (!(ADDRESS & (1<<BIT))) // Is bit clear?
//#################################################################### Variables
uint16_t word=0; // Counter
uint8_t byte1, byte2;
uint16_t buffer;
uint8_t high,low = 0; // Variables used with uniq (high and low byte)
//################################################################# Main routine
int main(void)
{
cli(); // Disable interrupts
usiTwiSlaveInit(SLAVE_ADDR_ATTINY); // TWI slave init
sei(); // Re-enable interrupts
for (int i = 0; i < 10; i++) // Fill buffers with arbitrary data
txbuffer = i + 10;
for (int i = 0; i < 4; i++)
rxbuffer = i + 20;
while(1)
{
//############################################ Read data from reception buffer
// 8 bit variables
byte1 = rxbuffer[0];
byte2 = rxbuffer[1];
// 2 8 bit variables converted into a 16 bit number
low = rxbuffer[2];
hig = rxbuffer[3];
word = uniq(low,high);
//########################################## Write data to transmission buffer
// 8 bit variables
txbuffer[0]= byte1;
txbuffer[1]= byte2;
// 16 bit variable broken up into its high and low byte
buffer = word;
txbuffer[2] = LOW_BYTE(buffer);
txbuffer[3] = HIGH_BYTE(buffer);
//############################################################################
} //end.while
} //end.main
Alles anzeigen
danach wieder die Main aus der anderen Anleitung und bei I2C-Tools kam beim schrieben immer öfter der Fehler:
Error: Write failed
bzw beim Dumpen wurde der Speicher nur zum Teil oder garnicht ausgelesen.
Danach war er auch meistens auch nicht mehr im I2C Bus zu sehen.
Der andere µC ging weiter ohne Probleme.
Erst dachte ich an eine Montags µC und habe einen neuen genommen und mit der Software aus der Anleitung geflasht. Jetzt gingen beide perfekt bis ich wieder die Main geflasht habe...:(
dann habe ich mir mal usiTwiSlave.c angesehen
#if defined( __AVR_ATtiny2313__ )
#define DDR_USI DDRB <<<<<<<<<<<<
#define PORT_USI PORTB <<<<<<<<<<<<
#define PIN_USI PINB <<<<<<<<<<<<
#define PORT_USI_SDA PB5
#define PORT_USI_SCL PB7
#define PIN_USI_SDA PINB5
#define PIN_USI_SCL PINB7
#define USI_START_COND_INT USISIF
#define USI_START_VECTOR USI_START_vect
#define USI_OVERFLOW_VECTOR USI_OVERFLOW_vect
Alles anzeigen
Wenn ich das richtig verstanden habe is doch DDRB das EEProm.
Jetzt meine These kann es ein das durch das "Programm" das EEProm permanent beschrieben wurde und es über ca. 100.000 schreib zyklen gekommen ist und das EEprom jetzt schrott ist?
Wenn ja kann man statt dem EEProm den RAM nehmen und die Lib entsprechen umbauen?
MFG
LED_PI