⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是用瑞萨单片机R8C写的IIC程序
💻 C
字号:
/************************************************************************************
*																					*
*	File Name	: main.c															*
*	Contents	: Main program of I2C communication (master transmit/receive mode)	*
*					sample program for R8C/2D Group									*
*	Copyright(C)2007, Renesas Technology Corp.										*
*	Copyright(C)2007, Renesas Solutions Corp.										*
*	All rights reserved.															*
*	Version		: 2.00																*
*	note		: 1.00	: First version												*
*				: 2.00	: System clock changed to High-speed on-chip oscillator		*
*						: The MOV instruction used to set bits MST and TRS			*
************************************************************************************/
#include "r8c2a.h"					/* Definition of the R8C/2D SFR */
#include "i2c_master.h"					/* Definition and declaration of this program */

/************************************************************************************
Name:        main
Parameters:  None
Returns:     None
Description: User main
************************************************************************************/
void main(void)
{
	unsigned int i = 0;
unsigned int j;

	asm("FCLR I");						/* Interrupt disabled */

	/*-----------------------------------------------------------
	-	Set High-speed on-chip oscillator clock to System clock	-
	-----------------------------------------------------------*/
	prc0 = 1;							/* Protect off */
	cm14 = 0;							/* Low-speed on-chip oscillator on */
	fra2 = 0x00;						/* Selects Divide-by-2 mode */
	fra00 = 1;							/* High-speed on-chip oscillator on */
	while( i <= 255 ) i++;				/* This setting is an example of waiting time for the */
										/* oscillation stabilization. Please evaluate the time */
										/* for oscillation stabilization by a user. */
	fra01 = 1;							/* Selects High-speed on-chip oscillator */
	cm16 = 0;							/* No division mode in system clock division */
	cm17 = 0;
	cm06 = 0;							/* CM16 and CM17 enable */
	prc0 = 0;							/* Protect on */

	/*-----------------------------------
	-	Initialize I2C SFR				-
	-----------------------------------*/
	sfr_init();							/* Initial setting of I2C SFR */

	asm("FSET I");						/* Interrupt enable */

	while(1){
			for(j=0;j<50;j++)
			{};	
			
		i2c_communication();			/* communication main routine */
			for(j=0;j<50;j++)
			{};	
	}
}
/************************************************************************************
Name:        sfr_init
Parameters:  None
Returns:     None
Description: Initial setting of I2C SFR
************************************************************************************/
void sfr_init(void)
{
	/* Setting I2C mode (master transmit mode) */
	pd3 &= 0xCF;						/* P3_5,P3_4:input mode */
	mstiic = 1;							/* I2C bus standby */
	iicsel = 1;							/* I2C bus function */

	stop_icsr = 0;						/* stop conditon detection flag clear */
	ice_iccr1 = 1;						/* I2C bus interface enabled */
	iccr1 = 0x8D;						/* Set IIC bus control register 1 */
										/* Transfer clock:f1/200 */
										/* (when f1 equals to 20MHz, transmitted at 100kHz) */
										/* Slave receive mode */
	iccr2 = 0xF0;						/* Set IIC bus control register 2 */
										/* Initialize */
	icmr = 0x07;						/* Set IIC bus mode register */
										/* 9bits count */
										/* No wait insertion */
										/* Data transfer with MSB-first */
	icier = 0x04;						/* Set IIC bus Interrupt enable register */
										/* 0 is transmitted as acknowledge bit in receive mode */
										/* Value of receive acknowledge bit is ignored */
										/* and continuous transfer is performed. */
										/* Disables stop condition detection interrupt request */
										/* Disables NACK receive interrupt request and */
										/* arbitration lost error interrupt request */
										/* Disables receive data full and overrun */
										/* error interrupt request */
										/* Disables transmit end interrupt request */
										/* Disables transmit data empty interrupt request */
	icsr = 0x00;						/* Set IIC bus status register */
										/* Initialize */
	sar = 0x00;							/* Set "0x00" to slave address register */
	iicic = 0x00;						/* Disable IIC Interrupt */

	/* INT0 and INT1 interrupt request enable */
	int1sel = 0;						/* Set P1_5, P1_7 pin as INT1 */
	tiosel_traioc = 0;					/* Set P1_7 pin as INT1 */
	inten = 0x05;						/* INT0 input enable */
										/* one edge on INT0 polartity */
										/* INT1 input enable */
										/* one edge on INT1 polarity */
	intf = 0x00;						/* INT0 input filter:no filter */
										/* INT1 input filter:no filter */
	int0ic = 0x00;						/* Disable INT0 Interrupt */
										/* falling edge on INT0 polarity */
	int1ic = 0x00;						/* Disable INT1 Interrupt */
										/* falling edge on INT1 polarity */
}
/************************************************************************************
Name:        i2c_communication
Parameters:  None
Returns:     None
Description: communication main routine
************************************************************************************/
void i2c_communication(void)
{
	mode = transmit;
		start_condition();				/* start condition generation */
		info = transmit_slave_address();	/* transmit slave address */
		if(info != NG){
			info = transmit_data_reg();		/* data transmission */
		}
		else{
		stop_condition();				/* stop conditon generation */
		}
//		iccr1 &= 0xCF;					/* slave mode(mst_iccr1 = 0) */
										/* receive mode(trs_iccr1 = 0) */
//		tdre_icsr = 0;					/* transmit data empty flag clear */

	mode = receive;
//		stop_condition();                 //注意一般没有这一句
//	iccr1 &= 0xEF;						/* receive mode(trs_iccr1 = 0) */
	iccr2 = 0x30;						/* stop condition generation */
//	tend_icsr = 0;						/* transmit end flag clear */
//	nackf_icsr = 0;						/* no acknowledge detection flag clear */
//	while(stop_icsr == 0);				/* stop condition detected ? */
//	stop_icsr = 0;						/* stop condition detection flag clear */
			start_condition();			/* start condition generation */
			info = transmit_slave_address();	/* transmit slave address */
			if(info != NG){
			receive_data();			/* receive operation */
	      	}
		   else{
			stop_condition();		/* stop condition generation */
	     	}
			iccr1 &= 0xCF;				/* slave mode(mst_iccr1 = 0) */
										/* receive mode(trs_iccr1 = 0) */				/* slave mode(mst_iccr1 = 0) */

}
/************************************************************************************
Name:        start_condition
Parameters:  None
Returns:     None
Description: start condition generation
************************************************************************************/
void start_condition(void)
{
	stop_icsr = 0;						/* stop condition detection flag clear */
	while(bbsy_iccr2 == 1);				/* bus enable ? */
	iccr1 |= 0x30;						/* master mode(mst_iccr1 = 1) */
										/* transmit mode(trs_iccr1 = 1) */
	iccr2 = 0xB0;						/* start condition generation */
}
/************************************************************************************
Name:        transmit_slave_address
Parameters:  None
Returns:     None
Description: transmission of slave address with the direciton of transmit/receive
************************************************************************************/
unsigned char transmit_slave_address(void)
{
	while(tdre_icsr == 0);				/* icdrt register empty ? */
	if(mode == transmit){
		icdrt = data[0] | 0x00;			/* set b0 to "0"(master transmit) */
	}
	else{
		icdrt = data[0] | 0x01;			/* set b0 to "1"(master receive) */
	}
	while(tend_icsr == 0);				/* transmission completed ? */
	if(ackbr_icier != 0){				/* no acknowledge received ? */
		return NG;
	}
	return OK;
}
/************************************************************************************
Name:        transmit_data
Parameters:  None
Returns:     None
Description: data trnsmission
************************************************************************************/
unsigned char transmit_data(void)
{
	unsigned char i;

	for(i = 1; i < count; i ++){
		icdrt = data[i];				/* data transmission */
		while(tdre_icsr == 0);			/* icdrt register empty ? */
		if(i == count -1){
			while(tend_icsr == 0);		/* transmission completed ? */
		}
		if(nackf_icsr != 0){			/* no acknowledge detected ? */
			nackf_icsr = 0;				/* no acknowledge detection flag clear */
			return NG;
		}
	}
	return OK;
}


unsigned char transmit_data_reg(void)
{
	
	icdrt = data[1];/* set b0 to "0"(master transmit) */
	while(tdre_icsr == 0);				/* icdrt register empty ? */
	
		

	while(tend_icsr == 0);				/* transmission completed ? */
	if(ackbr_icier != 0){				/* no acknowledge received ? */
		nackf_icsr = 0;				/* no acknowledge detection flag clear */
		return NG;
	}
	return OK;
}
/************************************************************************************
Name:        stop_condition
Parameters:  None
Returns:     None
Description: stop condition generation
************************************************************************************/
void stop_condition(void)
{
	iccr1 &= 0xEF;						/* receive mode(trs_iccr1 = 0) */
	iccr2 = 0x30;						/* stop condition generation */
	tend_icsr = 0;						/* transmit end flag clear */
	nackf_icsr = 0;						/* no acknowledge detection flag clear */
	while(stop_icsr == 0);				/* stop condition detected ? */
	stop_icsr = 0;						/* stop condition detection flag clear */
}
/************************************************************************************
Name:        receive_data
Parameters:  None
Returns:     None
Description: data receive
************************************************************************************/
void receive_data( void )
{
unsigned char i = 0;

	tend_icsr = 0;						/* transmit end flag clear */
	iccr1 &= 0xEF;						/* receive mode(trs_iccr1 = 0) */
	tdre_icsr = 0;						/* transmit data empty flag clear */
	ackbt_icier = 0;					/* "0" is transmitted as acknowledge bit */
	data_store[0] = icdrr;				/* dummy-read */


		while(rdrf_icsr == 0);			/* data receive completed ? */

					/* the previous data of the last one will NOT YET received ? */
			data_store[i] = icdrr;		/* data read */
	rcvd_iccr1 = 0;						/* receive operation enable after next data receive */
	stop_icsr = 0;						/* stop condition detection flag clear */
	ackbt_icier = 0;					/* "0" is transmitted as acknowledge bit */
		stop_condition();	
		
}
/************************************************************************************
Name:        last_2bytes_data_receive
Parameters:  the number of the received data
Returns:     None
Description: the last 2 bytes of data receive and stop condition generation
************************************************************************************/
void last_2bytes_data_receive(unsigned char r_count)
{
	unsigned i = r_count;

	ackbt_icier = 1;					/* "1" is transmitted as acknowledge bit */
	rcvd_iccr1 = 1;						/* receive operation disable after next data receive */

	data_store[i] = icdrr;				/* the previous data of the last one receive */
	i ++;
	while(rdrf_icsr == 0);				/* data receive completed ? */

	iccr2 = 0x30;						/* stop condition generation */
	while(stop_icsr == 0);				/* stop condition detected ? */

	data_store[i] = icdrr;				/* the last data read */
	rcvd_iccr1 = 0;						/* receive operation enable after next data receive */
	stop_icsr = 0;						/* stop condition detection flag clear */
	ackbt_icier = 0;					/* "0" is transmitted as acknowledge bit */
}

⌨️ 快捷键说明

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