i2c_sample_master.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 431 行 · 第 1/2 页

C
431
字号
    {	/* Master transmitting failure */
	err_status = ADDR_ACK_ERR;	    /* addres ACK error is set */
	led_pt = LED_2;			    /* turn on LED error */
	clr_hbit(I2CCTL, I2CCTL_I2CMSTA);   /* stop sequence */
	put_hvalue(I2CSR, 0);		    /* I2CSR register clear */
	return;
    }

    i = 0;
    while ( i < I2C_TEMP_SIZE )
    {
	put_hvalue(I2CSR, 0);				/* I2CSR register clear */
	wait_for_send_receive();			/* waiting for receiving data */
	I2C_ReceivData[i] = (UBYTE)(get_hvalue(I2CDR)&0xFF);	/* read data */
        if( i==I2C_TEMP_SIZE-1 )
        {
            set_hbit(I2CCTL, I2CCTL_I2CTXAK);
	    break;
        }
        clr_hbit(I2CCTL, I2CCTL_I2CTXAK);
	i++;
    }

    put_hvalue(I2CSR, 0);
    clr_hbit(I2CCTL, I2CCTL_I2CMSTA);
    clr_hbit(I2CCTL, I2CCTL_I2CTXAK);

    return;

}
#endif

/******************************************************************/
/*  I2C-Data send                                                 */
/*  Function : i2c_send_data (Master)                             */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  Nothing                                     */
/******************************************************************/
void i2c_send_data(void)
{
	int i;
	
	set_hbit(I2CCTL, I2CCTL_I2CMTX);			/* Master sends data */
	
	while((get_hvalue(I2CSR)&I2CSR_I2CMBB) == I2CSR_I2CMBB)
		;	/* Waiting for bus free */
	
	send_addr_data(WRITE_MODE);					/* address data transmission */
	if(err_status==NO_ERR)
	{
		if((get_hvalue(I2CSR)&I2CSR_I2CRXAK) == I2CSR_I2CRXAK)
		{	/* Master transmitting failure */
			err_status = ADDR_ACK_ERR;			/* addres ACK error is set */
			led_pt = LED_2;						/* turn on LED error */
			clr_hbit(I2CCTL, I2CCTL_I2CMSTA);	/* stop sequence */
			put_hvalue(I2CSR, 0);				/* I2CSR register clear */
			return;
		}
		
		put_hvalue(I2CSR, 0);					/* I2CSR register clear */
		
		for(i=0; i<BUFF_SIZE; i++)
		{
			send_byte_data(I2C_SendData[i]);		/* 1 byte data transmit function */
			
			if((get_hvalue(I2CSR)&I2CSR_I2CRXAK) == I2CSR_I2CRXAK)
			{	/* Master transmitted failure */
				err_status = DATA_ACK_ERR;			/* data ACK error is set */
				led_pt = LED_1;						/* turn on LED error */
				clr_hbit(I2CCTL, I2CCTL_I2CMSTA);	/* stop sequence */
				put_hvalue(I2CSR, 0);				/* I2CSR register clear */
				return;
			}
			
			clr_hbit(I2CSR, I2CSR_I2CMCF);		/* I2CMCF bit clear */
		}
	}
	
	put_hvalue(I2CSR, 0);						/* I2CSR register clear */
	clr_hbit(I2CCTL, I2CCTL_I2CMSTA);			/* stop sequence */
	return;
}

/******************************************************************/
/*  I2C-Data receive                                              */
/*  Function : i2c_receive_data (Master)                          */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  Nothing                                     */
/******************************************************************/
void i2c_receive_data(void)
{
	int i;
	
	clr_hbit(I2CCTL, I2CCTL_I2CMTX);			/* Master receives data */
	
	while((get_hvalue(I2CSR)&I2CSR_I2CMBB) == I2CSR_I2CMBB)
		;	/* Waiting for bus free */
	
	send_addr_data(READ_MODE);					/* address data transmission */
	if(err_status==NO_ERR)
	{
		if((get_hvalue(I2CSR)&I2CSR_I2CRXAK) == I2CSR_I2CRXAK)
		{	/* Master receiving failure */
			err_status = ADDR_ACK_ERR;			/* addres ACK error is set */
			led_pt = LED_2;						/* turn on LED error */
			clr_hbit(I2CCTL, I2CCTL_I2CMSTA);	/* stop sequence */
			put_hvalue(I2CSR, 0);				/* I2CSR register clear */
			return;
		}
		
		i = 0;
		do{
			put_hvalue(I2CSR, 0);				/* I2CSR register clear */
			
			if(i==(BUFF_SIZE-1))
				break;
			
			wait_for_send_receive();			/* waiting for receiving data */
			I2C_ReceivData[i] = (UBYTE)(get_hvalue(I2CDR)&0xFF);	/* read data */
			i++;
		}while(i<BUFF_SIZE);
		
		set_hbit(I2CCTL, I2CCTL_I2CTXAK);		/* NACK is transmitted after data receiving */
		wait_for_send_receive();				/* waiting for receiving data */
		I2C_ReceivData[i] = (UBYTE)(get_hvalue(I2CDR)&0xFF);	/* read data */
		
		put_hvalue(I2CSR, 0);					/* I2CSR register clear */
		clr_hbit(I2CCTL, I2CCTL_I2CTXAK);		/* I2CCTL_I2CTXAK bit clear */
		clr_hbit(I2CCTL, I2CCTL_I2CMSTA);		/* stop sequence */
	}
	return;
}

/******************************************************************/
/*  I2C-Data send                                                 */
/*  Function : send_addr_data                                     */
/*      Parameters                                                */
/*          Input  :  0:write  1:read                             */
/*          Output :  Nothing                                     */
/******************************************************************/
void send_addr_data(int mode)
{
	if(mode==READ_MODE)
	{	/* Slave address and R are set */
		put_hvalue(I2CDR, ((SLAVE_ADDRESS<<1)|READ_MODE)&0xFF);
	}
	else
	{	/* Slave address and W are set */
		put_hvalue(I2CDR, ((SLAVE_ADDRESS<<1)|WRITE_MODE)&0xFF);
	}
	
	set_hbit(I2CCTL, I2CCTL_I2CMSTA);	/* start sequence */
	
	if((get_hvalue(I2CSR)&I2CSR_I2CMAL) == I2CSR_I2CMAL)
	{	/* Master received failure */
		err_status = BUS_ERR;
		led_pt = LED_3;					/* turn on LED error */
		put_hvalue(I2CSR, 0);			/* I2CSR register clear */
	}
	else
	{
		wait_for_send_receive();		/* waiting for sending data */
	}
	
	return;
}

/******************************************************************/
/*  I2C-Data send                                                 */
/*  Function : send_byte_data                                     */
/*      Parameters                                                */
/*          Input  :  send data                                   */
/*          Output :  Nothing                                     */
/******************************************************************/
void send_byte_data(UBYTE send_data)
{
	put_hvalue(I2CDR, send_data);	/* send data is set */
	wait_for_send_receive();		/* waiting for sending data */
	return;
}

/******************************************************************/
/*  I2C-Data send/receive                                         */
/*  Function : wait_for_send_receive                              */
/*      Parameters                                                */
/*          Input  :  Nothing                                     */
/*          Output :  Nothing                                     */
/******************************************************************/
void wait_for_send_receive(void)
{
	while((get_hvalue(I2CSR)&I2CSR_I2CMCF) != I2CSR_I2CMCF)
		;	/* during sending data or receiving data (1byte data)*/
	return;
}

/******************************************************************/
/*  Compare received data                                         */
/*  Function : cmp_data_fn                                        */
/*      Parameters                                                */
/*          Input  :  received data, compare data, data size      */
/*          Output :  OK/NG                                       */
/******************************************************************/
int cmp_data_fn(UBYTE *r_data, UBYTE *c_data, int n)
{
	UBYTE *rp = r_data;
	UBYTE *cp = c_data;
	
	for( ; 0<n; ++rp, ++cp, --n)
		if(*rp != *cp)
			return NG;
	return OK;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?