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 + -
显示快捷键?