Hallo,
das was du vorhast wird vom AVR glaube ich nicht in Hardware unterstützt. Du musst die Kommunikation in Software nachbauen. Dazu setzt du die CS Leitung und "wackelst" selbst an der Clock-Leitung. Die Datenleitung musst du entsprechend des Datenblatts deines IC entweder als Ausgang oder als Eingang beschalten. Ich habe mir das Datenblatt zu deinem IC nicht angesehen, aber normalerweise ist die Datenleitung immer erst Ausgang, um eine Art Befehlscode zu übertragen. Dann wird je nach Befehl der Status als Ausgang beibehalten und weitere Parameter gesendet, oder auf Eingang umgeschaltet und der IC überträgt die Antwort.
Für dieses Vorhaben musst du nicht unbedingt die SS SCK MISO und MOSI Leitungen deines AVR verwenden. Ich würde dir sogar ausdrücklich raten andere zu verwenden. So vermeidest du Probleme und Wechselwirkungen während des ISP-flashen deines AVR.
Ich habe so eine Kommunikation mal für einen BMA020 von ELV umgesetzt. Aber der Code ist speziell auf diesen Sensor angepasst und kann deshalb bei dir vermutlich nicht verwendet werden. Trotzdem hier ein paar Auszüge als Denkanstoss für dich:
Code:
volatile U8 *BMAportOut;
volatile U8 *BMAportIn;
volatile U8 *BMADDR;
volatile U8 Pin_CSB;
volatile U8 Pin_SCK;
volatile U8 Pin_SDA;
#define BMA020_CSB0 *BMAportOut = ~(~*BMAportOut | 1<<Pin_CSB)
#define BMA020_CSB1 *BMAportOut = (*BMAportOut | 1<<Pin_CSB)
#define BMA020_SCK0 *BMAportOut = ~(~*BMAportOut | 1<<Pin_SCK)
#define BMA020_SCK1 *BMAportOut = (*BMAportOut | 1<<Pin_SCK)
#define BMA020_SDA0 *BMAportOut = ~(~*BMAportOut | 1<<Pin_SDA)
#define BMA020_SDA1 *BMAportOut = (*BMAportOut | 1<<Pin_SDA)
#define BMA020_SDA_output *BMADDR = (*BMADDR | 1<<Pin_SDA)
#define BMA020_SDA_input *BMADDR = ~(~*BMADDR | 1<<Pin_SDA)
#define BMA020_SDAin ((*BMAportIn & 1<<Pin_SDA) != 0)
bool BMA020_Init (volatile U8 *IOportOut, volatile U8 *IOportIn, volatile U8 *DDRport, U8 CSB, U8 SCK, U8 SDA)
{
BMAportOut = IOportOut;
BMAportIn = IOportIn;
BMADDR = DDRport;
Pin_CSB = CSB;
Pin_SCK = SCK;
Pin_SDA = SDA;
*DDRport = (*DDRport | 1<<CSB);
*DDRport = (*DDRport | 1<<SCK);
BMA020_SDA_output;
BMA020_CSB1;
BMA020_SCK1;
BMA020_SDA0;
}
void BMA020_WriteRegister (U8 Register, U8 Data)
{
BMA020_SDA_output;
BMA020_SCK1;
BMA020_CSB0;
BMA020_ByteOut (Register);
BMA020_ByteOut (Data);
BMA020_SCK1;
_delay_us (Clock_time);
BMA020_CSB1;
}
U8 BMA020_ReadRegister (U8 Register, bool ReadFinished)
{
BMA020_SDA_output;
BMA020_SCK1;
BMA020_CSB0;
BMA020_ByteOut (Register | 0b10000000);
BMA020_SDA_input;
_delay_us (Clock_time);
BMA020_SCK0;
_delay_us (Clock_time);
BMA020_SCK1;
U8 Data = BMA020_ByteIn ();
if (ReadFinished)
BMA020_CSB1;
return (Data);
}
void BMA020_ByteOut (U8 Data)
{
U8 i1;
for (i1 = 8; i1 > 0; i1--)
{
_delay_us (Clock_time);
BMA020_SCK0;
if ((Data & 0b10000000) == 0)
{
BMA020_SDA0;
Data = ((Data<<1) & 0b11111110);
}
else
{
BMA020_SDA1;
Data = ((Data<<1) | 1);
}
_delay_us (Clock_time);
BMA020_SCK1;
}
}
U8 BMA020_ByteIn (void)
{
U8 i1;
U8 Data = 0;
for (i1 = 8; i1 > 0; i1--)
{
_delay_us (Clock_time);
BMA020_SCK0;
if (BMA020_SDAin)
Data = (Data<<1) | 1;
else
Data = (Data<<1) & 0b11111110;
_delay_us (Clock_time);
BMA020_SCK1;
}
return (Data);
}
Viele Grüße
Andreas
Lesezeichen