Ma dole jest rozwiązanie problemu wraz z kodem obsługi KAmodMEMS2 przez I2C
Witam,
Chciałbym podłączyć akcelerometr LIS35, używając interfejsu I2C. Problem pojawią z obsługą biblioteki TWI (jest to inna nazwa I2C prawda?), Próbuję zrobić tak:
Kod ten jest tak naprawdę połączeniem kodów obsługujących I2C znalezionych w necie. Niestety nie chce działać. Program zawiesza się w funkcji readI2C()
Bardzo proszę o pomoc, może ktoś ma napisaną obsługę tego modułu przez I2C byłbym bardzo wdzięczny.
Witam,
Chciałbym podłączyć akcelerometr LIS35, używając interfejsu I2C. Problem pojawią z obsługą biblioteki TWI (jest to inna nazwa I2C prawda?), Próbuję zrobić tak:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "uart.h"
#include "TWI.h"
// częstotliwość CPU w MHz
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
// prędkość transmisji 9600
#define UART_BAUD_RATE 9600
unsigned int readI2C(unsigned char idx, unsigned char RegAddr)
{
unsigned char tmpL, tmpH;
TWI_Start();
TWI_Write(0x90 | (idx << 1));
TWI_Write(RegAddr);
TWI_Start();
TWI_Write(0x91 | (idx << 1));
tmpH = TWI_Read(ACK);
tmpL = TWI_Read(NACK);
TWI_Stop();
return (unsigned int)(tmpL + (tmpH << 8));
}
int main(void)
{
TWI_Init();
unsigned int c;
// włączenie modułu UART, ustawienie prędkości transmisji
uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
// odblokowanie przerwań (transmisja obsługiwana jest w przerwaniach)
sei();
// wysłanie ciągu znaków
uart_puts("TEST\n");
unsigned int data = 0;
for(;;)
{
data = readI2C(0, 0x00);
char str[10];
itoa(data, str, 10);
uart_puts(&str);
uart_puts(" ");
c = uart_getc();
if(c & UART_NO_DATA)
{
// brak danych w buforze
}
else
{
// dane dostępne, sprawdzenie, czy nie było błędu
if(c & UART_FRAME_ERROR)
{
// wykryto błąd ramki (np. brak bitu stopu)
uart_puts_P("UART Frame Error: ");
}
if(c & UART_OVERRUN_ERROR)
{
// wykryto nadpisanie
uart_puts_P("UART Overrun Error: ");
}
if(c & UART_BUFFER_OVERFLOW)
{
// wykryto całkowite zapełnienie bufora cyklicznego
uart_puts_P("Buffer overflow error: ");
}
// odesłanie znaku
uart_putc((unsigned char)c);
}
}
}
Kod ten jest tak naprawdę połączeniem kodów obsługujących I2C znalezionych w necie. Niestety nie chce działać. Program zawiesza się w funkcji readI2C()
Bardzo proszę o pomoc, może ktoś ma napisaną obsługę tego modułu przez I2C byłbym bardzo wdzięczny.
