📄 main.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 + -