i2c_framing_layer.c
来自「BlackFin处理器视频演示代码」· C语言 代码 · 共 337 行
C
337 行
/**
*@file i2c_framing_layer.c
*@author Zlatan Stanojevic
*/
#if defined( __ADSPBF533__ ) || defined( __ADSPBF561__ )
#include "i2c_timing_layer.h"
#include "i2c_framing_layer.h"
#define MIN( a, b ) ( a < b ? a : b )
#define MSG_BUFFER_SIZE 30
#define MSG_BUFFER_REMAINING ( ( msg_buffer.buffer + MSG_BUFFER_SIZE ) - msg_buffer.p )
struct
{
I2CByte buffer[MSG_BUFFER_SIZE];
I2CByte *p;
} msg_buffer;
static struct
{
unsigned char *message;
unsigned char offset;
} static_read_info;
static void framingCallback();
void I2CInitFraming()
{
pTimingCallback = framingCallback;
static_read_info.offset = 0;
}
I2CCallback messageCallback;
static void framingCallback( I2CTimingStatus stat, I2CByte *last )
{
unsigned char i;
if( static_read_info.offset )
{
i = static_read_info.offset;
do
{
static_read_info.message[i - static_read_info.offset] =
last[i].data;
}
while( ! last[i++].last_byte );
}
i = 0;
while( (last++)->ack ) i++;
if( messageCallback )
messageCallback( i, static_read_info.message );
}
I2CScanCallback scanbusCallback;
void intermediateScanbusCallback( I2CTimingStatus stat, I2CByte *msg )
{
if( stat == I2CSTAT_SUCCESS )
scanbusCallback( msg->data >> 1 );
}
#define SCANBUS_CYCLE MSG_BUFFER_SIZE
void I2CScanbus( I2CScanCallback callback )
{
unsigned char i, j = 128;
pTimingCallback = intermediateScanbusCallback;
scanbusCallback = callback;
do
{
for( i = 0; i < MIN( SCANBUS_CYCLE, j ); i++ )
{
msg_buffer.buffer[i].last_byte = 0;
msg_buffer.buffer[i].read_byte = 0;
msg_buffer.buffer[i].retry = 0;
msg_buffer.buffer[i].ack = 0;
msg_buffer.buffer[i].restart = 1;
msg_buffer.buffer[i].callback = 1;
msg_buffer.buffer[i].data = ( --j ) << 1;
}
msg_buffer.buffer[--i].last_byte = 1;
I2CTransmit( msg_buffer.buffer );
while( busy_flag );
}
while( j );
}
void _I2CRead_non_blocking( unsigned char hwid, unsigned char *message,
unsigned char msg_length, I2CCallback callback )
{
unsigned char i;
while( busy_flag );
pTimingCallback = framingCallback;
messageCallback = callback;
msg_buffer.buffer[0].last_byte = 0;
msg_buffer.buffer[0].read_byte = 0;
msg_buffer.buffer[0].retry = 1;
msg_buffer.buffer[0].ack = 0;
msg_buffer.buffer[0].restart = 0;
msg_buffer.buffer[0].callback = 0;
msg_buffer.buffer[0].data = hwid << 1 | 1; //read
for( i = 1; i < msg_length + 1; i++ )
{
msg_buffer.buffer[i].last_byte = 0;
msg_buffer.buffer[i].read_byte = 1;
msg_buffer.buffer[i].retry = 0;
msg_buffer.buffer[i].ack = 0;
msg_buffer.buffer[i].restart = 0;
msg_buffer.buffer[i].callback = 0;
msg_buffer.buffer[i].data = 0x00;
}
i--;
msg_buffer.buffer[i].last_byte = 1;
msg_buffer.buffer[i].ack = 1;
msg_buffer.buffer[i].callback = 1;
static_read_info.message = message;
static_read_info.offset = 1;
I2CTransmit( msg_buffer.buffer );
}
void _I2CWrite_non_blocking( unsigned char hwid, unsigned char *message,
unsigned char msg_length, I2CCallback callback )
{
unsigned char i;
while( busy_flag );
pTimingCallback = framingCallback;
messageCallback = callback;
msg_buffer.buffer[0].last_byte = 0;
msg_buffer.buffer[0].read_byte = 0;
msg_buffer.buffer[0].retry = 1;
msg_buffer.buffer[0].ack = 0;
msg_buffer.buffer[0].restart = 0;
msg_buffer.buffer[0].callback = 0;
msg_buffer.buffer[0].data = hwid << 1; //write
for( i = 1; i < msg_length + 1; i++ )
{
msg_buffer.buffer[i].last_byte = 0;
msg_buffer.buffer[i].read_byte = 0;
msg_buffer.buffer[i].retry = 0;
msg_buffer.buffer[i].ack = 0;
msg_buffer.buffer[i].restart = 0;
msg_buffer.buffer[i].callback = 0;
msg_buffer.buffer[i].data = message[i - 1];
}
i--;
msg_buffer.buffer[i].last_byte = 1;
msg_buffer.buffer[i].ack = 1;
msg_buffer.buffer[i].callback = 1;
static_read_info.message = message;
static_read_info.offset = 0;
I2CTransmit( msg_buffer.buffer );
}
void _I2CSet_non_blocking( unsigned char hwid, unsigned char start_addr,
unsigned char *values, unsigned char vals_length, I2CCallback callback )
{
unsigned char i;
while( busy_flag );
pTimingCallback = framingCallback;
messageCallback = callback;
msg_buffer.buffer[0].last_byte = 0;
msg_buffer.buffer[0].read_byte = 0;
msg_buffer.buffer[0].retry = 1;
msg_buffer.buffer[0].ack = 0;
msg_buffer.buffer[0].restart = 0;
msg_buffer.buffer[0].callback = 0;
msg_buffer.buffer[0].data = hwid << 1; //write
msg_buffer.buffer[1].last_byte = 0;
msg_buffer.buffer[1].read_byte = 0;
msg_buffer.buffer[1].retry = 0;
msg_buffer.buffer[1].ack = 0;
msg_buffer.buffer[1].restart = 0;
msg_buffer.buffer[1].callback = 0;
msg_buffer.buffer[1].data = start_addr;
for( i = 2; i < vals_length + 2; i++ )
{
msg_buffer.buffer[i].last_byte = 0;
msg_buffer.buffer[i].read_byte = 0;
msg_buffer.buffer[i].retry = 0;
msg_buffer.buffer[i].ack = 0;
msg_buffer.buffer[i].restart = 0;
msg_buffer.buffer[i].callback = 0;
msg_buffer.buffer[i].data = values[i - 2];
}
i--;
msg_buffer.buffer[i].last_byte = 1;
msg_buffer.buffer[i].ack = 1;
msg_buffer.buffer[i].callback = 1;
static_read_info.message = values;
static_read_info.offset = 0;
I2CTransmit( msg_buffer.buffer );
}
void _I2CGet_non_blocking( unsigned char hwid, unsigned char start_addr,
unsigned char *values, unsigned char vals_length, I2CCallback callback )
{
unsigned char i;
while( busy_flag );
pTimingCallback = framingCallback;
messageCallback = callback;
msg_buffer.buffer[0].last_byte = 0;
msg_buffer.buffer[0].read_byte = 0;
msg_buffer.buffer[0].retry = 1;
msg_buffer.buffer[0].ack = 0;
msg_buffer.buffer[0].restart = 0;
msg_buffer.buffer[0].callback = 0;
msg_buffer.buffer[0].data = hwid << 1; //write
msg_buffer.buffer[1].last_byte = 0;
msg_buffer.buffer[1].read_byte = 0;
msg_buffer.buffer[1].retry = 0;
msg_buffer.buffer[1].ack = 0;
msg_buffer.buffer[1].restart = 0;
msg_buffer.buffer[1].callback = 0;
msg_buffer.buffer[1].data = start_addr;
msg_buffer.buffer[2].last_byte = 0;
msg_buffer.buffer[2].read_byte = 0;
msg_buffer.buffer[2].retry = 0;
msg_buffer.buffer[2].ack = 0;
msg_buffer.buffer[2].restart = 1;
msg_buffer.buffer[2].callback = 0;
msg_buffer.buffer[2].data = hwid << 1 | 1; //read
for( i = 3; i < vals_length + 3; i++ )
{
msg_buffer.buffer[i].last_byte = 0;
msg_buffer.buffer[i].read_byte = 1;
msg_buffer.buffer[i].retry = 0;
msg_buffer.buffer[i].ack = 0;
msg_buffer.buffer[i].restart = 0;
msg_buffer.buffer[i].callback = 0;
msg_buffer.buffer[i].data = 0x00;
}
i--;
msg_buffer.buffer[i].last_byte = 1;
msg_buffer.buffer[i].ack = 1;
msg_buffer.buffer[i].callback = 1;
static_read_info.message = values;
static_read_info.offset = 3;
I2CTransmit( msg_buffer.buffer );
}
void _I2CRead_blocking( unsigned char hwid, unsigned char *message,
unsigned char msg_length )
{
_I2CRead_non_blocking( hwid, message, msg_length, 0 );
while( busy_flag );
}
void _I2CWrite_blocking( unsigned char hwid, unsigned char *message,
unsigned char msg_length )
{
_I2CWrite_non_blocking( hwid, message, msg_length, 0 );
while( busy_flag );
}
void _I2CSet_blocking( unsigned char hwid, unsigned char start_addr,
unsigned char *values, unsigned char vals_length )
{
_I2CSet_non_blocking( hwid, start_addr, values, vals_length, 0 );
while( busy_flag );
}
void _I2CGet_blocking( unsigned char hwid, unsigned char start_addr,
unsigned char *values, unsigned char vals_length )
{
_I2CGet_non_blocking( hwid, start_addr, values, vals_length, 0 );
while( busy_flag );
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?