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