Es wird eine Slave Adresse angegeben und diese wird an packer.adress übergebenpacket.address = SLAVE_ADDRESS;
packer_length bekommt durch 32 eine Länge von 32 Byte (kannman auch 8 oder 16 angeben?)packet.data_length = 32; // 32 Byte lesen
in packer.data stehen beim lesen die Daten und werden an i2c_read_buffer übergeben.packet.data = i2c_read_buffer;
es wurde ein timeout von 0 definiert. Wenn keine ACK wird Programm unterbrochen, LED_PB30_on wird eingeschaltet und Programm stopt (break)while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { LED_PB30_ON break; } }
Damit hat Data_Length eine Länge von 32 Bit und es werden 2x static für lesen und schreiben definiert.#define DATA_LENGTH 32 static uint8_t i2c_write_buffer[DATA_LENGTH];static uint8_t i2c_read_buffer[DATA_LENGTH];
Es werden wieder eine Slave Adresse verwendet, Länge festgelegt und an write übergeben und gesendet.packet.address = SLAVE_ADDRESS; // 7bit Adresse packet.data_length = 1; // ein Byte senden packet.data = i2c_write_buffer; // dieser Buffer wird verwendet
Muss sowas auch nicht read?i2c_write_buffer[0] = 0; // 0 wird gesendet
gibt es verschiedene write_buffer da [0] steht?i2c_write_buffer[0] = 0; // 0 wird gesendet
packer_length bekommt durch 32 eine Länge von 32 Byte (kannman auch 8 oder 16 angeben?)
packet.data wird hier genau genommen die Adresse des Arrays übergeben. Dadurch "wissen" die I2C Funktionen, wo sie Daten herbekommen oder ablegen sollen.in packer.data stehen beim lesen die Daten und werden an i2c_read_buffer übergeben.
while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { LED_PB30_ON break; } }es wurde ein timeout von 0 definiert. Wenn keine ACK wird Programm unterbrochen, LED_PB30_on wird eingeschaltet und Programm stopt (break)
i2c_write_buffer[0] = 0; // 0 wird gesendetMuss sowas auch nicht read?
gibt es verschiedene write_buffer da [0] steht?
i2c_write_buffer[0] = 0xff; //ff-alle aus packet.address = SLAVE_ADDRESS; //packet.data_length = DATA_LENGTH; packet.data_length = 1; packet.data = i2c_write_buffer;
#define LED1 PIN_PB05 // PA03 / PB30 - 1. Zahl LED+Taster auf P110 #define Button1 PIN_PB23 // PB23 / PA13 - 2. Zahl LED+Taster auf Nano SAM #define DATA_LENGTH 32 #define Timeout 1000 void configure_i2c(void); // Angabe Prototype void touch_write_data(void); void configure_port_pins(void); struct i2c_master_module i2c_master_instance; //generate the instance-struct for I2C-Master struct i2c_master_packet packet;
i2c_write_buffer[0] = 0xff; //ff-alle aus
#define DATA_LENGTH 32 packet.data_length = DATA_LENGTH;
i2c_write_buffer[0] = 0x00; i2c_write_buffer[1] = 0x01; i2c_write_buffer[2] = 0x02; packet.data_length = 3;
Ok, ich schaue es mir morgen Abend mal an.Vielleicht kannst du was draus machen.
enum status_code write_data_i2c(uint8_t address, uint8_t *buffer, uint8_t len) { uint16_t timeout; timeout = 0; packet.address = address; packet.data_length = len; packet.data = buffer; while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { return STATUS_ERR_TIMEOUT; break; } } return STATUS_OK; }; enum status_code read_data_i2c(uint8_t address, uint8_t *buffer, uint8_t len) { uint16_t timeout; timeout = 0; packet.address = address; packet.data_length = len; packet.data = buffer; while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { return STATUS_ERR_TIMEOUT; break; } } return STATUS_OK; };
enum status_code write_data_i2c(uint8_t address, uint8_t *buffer, uint8_t len); enum status_code read_data_i2c(uint8_t address, uint8_t *buffer, uint8_t len);