?? i2c.c
字號:
&ctrl,&addr_hi,&addr_lo);
if(rc != I2C_NO_ERR)
return rc;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
return rc;
//--- wr ADDRESS
i2c_lpc_wr_byte(addr_hi);
if(addr_lo != -1)
i2c_lpc_wr_byte(addr_lo);
//--- Write data
while(num--) //-- transmit data until length>0
{
rc = *buf++; //---
i2c_lpc_wr_byte(rc);
}
//-----------------------
i2c_lpc_stop();
rc = i2c_lpc_ask_polling_op(ctrl); //-- wait until write finished
i2c_lpc_stop();
return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
int m24xx_write(
int eeprom_type, //-- EEPROM type
int eeprom_addr, //-- start eeprom addr ( not included Hardware A2,A1,A0)
int eeprom_cs_val, //-- Hardware A2,A1,A0 (valid from 24XX32)
char * buf, //-- Data src buf
int num) //-- Bytes to write qty
{
int page_size = 0;
int rc;
int b_to_wr;
#if defined(__UCOS_)
INT8U err;
OSSemPend(gpSemI2Cop,0,&err); //-- Wait until I2C released(sem on)
VICIntEnClear = 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#elif defined(__TNKERNEL_)
tn_sem_acquire(&gSemI2Cop,TN_WAIT_INFINITE); //-- Wait until I2C released(sem on)
VICIntEnClear |= 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#endif
rc = I2C_NO_ERR;
for(;;)
{
rc = m24xx_page_size(eeprom_type,eeprom_addr,&page_size);
if(rc != I2C_NO_ERR)
break;
if(page_size == 0)
{
rc = I2C_ERR_24XX_BAD_PAGESIZE;
break;
}
rc = eeprom_addr%page_size;
if(rc != 0) //-- not fit on page alignment
{
b_to_wr = page_size - rc;
if(num < b_to_wr)
b_to_wr = num;
if(b_to_wr > 0)
{
rc = i2c_lpc_m24xx_wr(eeprom_type,eeprom_addr,eeprom_cs_val, buf,b_to_wr);
if(rc != I2C_NO_ERR)
break;
num -= b_to_wr;
eeprom_addr += b_to_wr;
buf += b_to_wr;
}
}
//--- write remainder(by pages,if possible)
while(num > 0)
{
if(num < page_size)
b_to_wr = num;
else
b_to_wr = page_size;
rc = i2c_lpc_m24xx_wr(eeprom_type,eeprom_addr,eeprom_cs_val, buf,b_to_wr);
if(rc != I2C_NO_ERR)
break;
num -= b_to_wr;
eeprom_addr += b_to_wr;
buf += b_to_wr;
}
break;
}
#if defined(__UCOS_)
VICIntEnable |= 0x00004000; //-- Enable Int 0
OSSemPost(gpSemI2Cop); //-- Set sem on(I2C is free)
#elif defined(__TNKERNEL_)
VICIntEnable |= 0x00004000; //-- Enable Int 0
tn_sem_signal(&gSemI2Cop); //-- Set sem on(I2C is free)
#endif
return rc;
}
//----------------------------------------------------------------------------
int m24xx_read(
int eeprom_type, //-- EEPROM type
int eeprom_addr, //-- start eeprom addr ( not included Hardware A2,A1,A0)
int eeprom_cs_val, //-- Hardware A2,A1,A0 (valid from 24XX32)
char * buf, //-- Data dst buf
int num) //-- Bytes to read qty
{
int page_size;
int rc;
int ctrl;
int addr_hi;
int addr_lo;
#if defined(__UCOS_)
INT8U err;
OSSemPend(gpSemI2Cop,0,&err); //-- Wait until I2C released(sem on)
VICIntEnClear = 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#elif defined(__TNKERNEL_)
tn_sem_acquire(&gSemI2Cop,TN_WAIT_INFINITE); //-- Wait until I2C released(sem on)
VICIntEnClear |= 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#endif
rc = I2C_NO_ERR;
for(;;)
{
if(num <=0)
{
rc = I2C_ERR_24XX_WRONG_NUM;
break;
}
//--- Here - just for addr checking
page_size = 0;
rc = m24xx_page_size(eeprom_type,eeprom_addr,&page_size);
if(rc != I2C_NO_ERR)
break;
if(page_size == 0)
{
rc = I2C_ERR_24XX_BAD_PAGESIZE;
break;
}
rc = m24xx_set_addr(eeprom_type,eeprom_addr,eeprom_cs_val,
&ctrl,&addr_hi,&addr_lo);
if(rc != I2C_NO_ERR)
break;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl & 0xFE); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
break;
//--- wr ADDRESS
i2c_lpc_wr_byte(addr_hi);
if(addr_lo != -1)
i2c_lpc_wr_byte(addr_lo);
//--- wr START + CONTROL again - for read start
rc = i2c_lpc_ctrl(ctrl | 0x01); //-- Now RD (RD/WI = 1)
if(rc != I2C_NO_ERR)
break;
rc = i2c_lpc_rx_to_buf(buf,num);
if(rc != I2C_NO_ERR)
break;
i2c_lpc_stop(); //---- Set STOP ---
break;
}
#if defined(__UCOS_)
VICIntEnable |= 0x00004000; //-- Enable Int 0
OSSemPost(gpSemI2Cop); //-- Set sem on(I2C is free)
#elif defined(__TNKERNEL_)
VICIntEnable |= 0x00004000; //-- Enable Int 0
tn_sem_signal(&gSemI2Cop); //-- Set sem on(I2C is free)
#endif
return rc;
}
//===========================================================================
//================ Temperature sensor LM75 ==================================
//===========================================================================
//----------------------------------------------------------------------------
static int lm75_set_addr(int cs_val, //-- Value of A0,A1,A2 for IC instance
int mode, //-- 8 - 8bit reg, 16 - 16 bit reg
int reg, //-- register that access
int * ctrl_val, //-- return - ctrl
int * point_val) //-- return - pointer reg val
{
int ctrl;
int point;
ctrl = (cs_val<<1) & 0x0E;
ctrl |= 0x90; //-- 1001xxxx
point = 0;
if(mode == 16)
{
if(reg == LM75_REG_TEMP)
point = 0;
else if(reg == LM75_REG_THYST)
point = 2;
else if(reg == LM75_REG_TSET)
point = 3;
else
return I2C_ERR_LM75_WRONG_REGISTER;
}
else if(mode == 8)
{
if(reg == LM75_REG_CONFIG)
point = 1;
else
return I2C_ERR_LM75_WRONG_REGISTER;
}
else
return I2C_ERR_WRONG_PARAM;
if(ctrl_val)
*ctrl_val = ctrl;
if(point_val)
*point_val = point;
return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
int lm75_read16(int cs_val,
int reg,
int * ret_val)
{
int point;
int ctrl;
int rc,rd_val;
unsigned char buf[4];
rc = lm75_set_addr(cs_val,16,reg,&ctrl,&point);
if(rc != I2C_NO_ERR)
return rc;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl & 0xFE); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
return rc;
//--- wr point
i2c_lpc_wr_byte(point);
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl | 0x01); //-- Now RD (RD/WI = 1)
if(rc != I2C_NO_ERR)
return rc;
rc = i2c_lpc_rx_to_buf(&buf[0],2);
if(rc != I2C_NO_ERR)
return rc;
i2c_lpc_stop();
rd_val = (buf[0]<<1)& 0x01FE; //-- msb
if(buf[1] & 0x80) //-- lsb
rd_val |= 0x01;
*ret_val = rd_val;
return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
int lm75_read_cfg(int cs_val,int * ret_val)
{
int point;
int ctrl;
int rc;
unsigned char buf[4];
rc = lm75_set_addr(cs_val,8,LM75_REG_CONFIG,&ctrl,&point);
if(rc != I2C_NO_ERR)
return rc;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl & 0xFE); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
return rc;
//--- wr point
i2c_lpc_wr_byte(point);
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl | 0x01); //-- Now RD (RD/WI = 1)
if(rc != I2C_NO_ERR)
return rc;
rc = i2c_lpc_rx_to_buf(&buf[0],1);
if(rc != I2C_NO_ERR)
return rc;
i2c_lpc_stop(); //-- Set STOP condition
*ret_val = buf[0];
return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
int lm75_write16(int cs_val,
int reg,
int wr_val)
{
int ctrl;
int point;
int rc;
rc = lm75_set_addr(cs_val,16,reg,&ctrl,&point);
if(rc != I2C_NO_ERR)
return rc;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl & 0xFE); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
return rc;
//--- wr point
i2c_lpc_wr_byte(point);
//--- wr msb
i2c_lpc_wr_byte((wr_val>>8)& 0xFF);
//--- wr lsb
i2c_lpc_wr_byte(wr_val & 0xFF);
i2c_lpc_stop();
return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
int lm75_write_cfg(int cs_val,int wr_val)
{
int point;
int ctrl;
int rc;
rc = lm75_set_addr(cs_val,8,LM75_REG_CONFIG,&ctrl,&point);
if(rc != I2C_NO_ERR)
return rc;
//--- wr START + CONTROL
rc = i2c_lpc_ctrl(ctrl & 0xFE); //-- Now WR (RD/WI = 0)
if(rc != I2C_NO_ERR)
return rc;
//--- wr point
i2c_lpc_wr_byte(point);
//--- wr data
i2c_lpc_wr_byte(wr_val & 0xFF);
i2c_lpc_stop();
return I2C_NO_ERR;
}
//---------------------------------------------------------------------------
int lm75_init()
{
int rc;
#if defined(__UCOS_)
INT8U err;
OSSemPend(gpSemI2Cop,0,&err); //-- Wait until I2C released(sem on)
VICIntEnClear = 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#elif defined(__TNKERNEL_)
tn_sem_acquire(&gSemI2Cop,TN_WAIT_INFINITE); //-- Wait until I2C released(sem on)
VICIntEnClear |= 0x00004000; //-- Disable Int 0 - from I/O extender PCA9555
#endif
rc = lm75_write_cfg(0,0);
#if defined(__UCOS_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -