При работе с протоколом I2C у меня возникли некоторые трудности. Для проверки протокола использую память 24LC256. Сначала я хочу послать туда байт потом считать его и переслать считаное по UART.
UART работает правильно - проверено.
Запись скорее всего нет, так как когда я менял адрес слейва на несуществующий, по уарту я получал ту же фигню. А теперь по поводу фигни... 0x2D 0x39 0x35. У меня есть подозрения, что гдето в настройках
TWI_BAUDSETTING что-то не так, потому как это должно быть равным "0", то есть "0x30".
Прошу подкинуть свежих идей, ипробовал разные комбинации, кстати на настройках
Код:
|
#define CPU_SPEED 32000000
#define BAUDRATE 200000 |
получал "0x30", но тем не менее не считывался посланый мной "0x22". Функция Clock_init(); для 32 MHz работает верно - UART работает также на этой частоте.
Вот часть моего кода с I2C:
Код:
|
#include ‹xmega_a1_xplained.h›//#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹string.h› //strlen()
#include ‹stdlib.h› //itoa()
#define CPU_SPEED 32000000 //32000000
#define BAUDRATE 400000 //400000
#define TWI_BAUD(F_SYS, F_TWI) ((F_SYS / (2 * F_TWI)) - 5)
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
#define EEPROM 0x57
//====================== UART initialisation ==================================
void UART_init(void)
{...}
//====================== UART Send ============================================
void Send_UART(char data[])
{...}
//////////////////////// I2C Init /////////////////////////////////////////////
void TWI_MasterInit(TWI_t *twi)
{
twi-›MASTER.BAUD = TWI_BAUDSETTING;
twi-›MASTER.CTRLA = TWI_MASTER_ENABLE_bm |
TWI_MASTER_INTLVL_HI_gc | //
TWI_MASTER_RIEN_bm | //
TWI_MASTER_WIEN_bm; //
twi-›MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
}
//////////////////////// I2C Send Adress //////////////////////////////////////
void Send_Address(TWI_t *twi, char Adresse, char RW)
{
twi-›MASTER.ADDR = (Adresse ‹‹ 1) + RW;
}
//////////////////////// I2C Send /////////////////////////////////////////////
void EEPROM_send_byte(TWI_t *twi, char Adresse, char byte)
{
Send_Address(twi, Adresse, 0);
_delay_us(500);
twi-›MASTER.DATA = byte;
twi-›MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
}
//////////////////////// I2C Read /////////////////////////////////////////////
char EEPROM_read_byte(TWI_t *twi, char *Adresse)
{
Send_Address(twi, Adresse, 1);
_delay_us(500);
//twi-›MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
return twi-›MASTER.DATA;
}
//====================== 32MHz Clock ==========================================
void Clock_init(void)
{
OSC.CTRL |= OSC_RC32MEN_bm; // Oscillator set to 32MHz
while(!(OSC.STATUS & OSC_RC32MEN_bm)); // Wait until the oscillator is ready
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // Clock set to 32MHz
// Prescaler A = CLK/2, Prescaler B/C = CLK/1
}
//====================== Body =================================================
int main (void)
{
char Buffer;
char Text;
Clock_init();
UART_init();
TWI_MasterInit(&TWIC);
while(1)
{
EEPROM_send_byte(&TWIC, EEPROM, 0x22);
_delay_ms(1000);
Buffer = EEPROM_read_byte(&TWIC, EEPROM);//0x50);//
//TWIC.MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc;
itoa(Buffer, Text, 10);
Send_UART(Text);
_delay_ms(1000);
}
} |
ЗЫ. на линии передачи у меня 2 резистора по 10кОм. Если их забрать во время процесса, то получается виннигрет изменяющихся переодично данных.