📄 i2c.c
字号:
#include <soc.h>
#include <csl_i2c.h>
#include <Osk5912.h>
#include <stdio.h>
#define OSK5912_POWER_I2C_ADDR 0x48
//#define I2C_DATA *( volatile unsigned short * )0xFFFB381C
#define OSK5912_I2C_MODE_SADP 3 // (S)tart..(A)ddr..(D)ata..(n)..sto(P)
//#define OSK5912_I2C_MODE_SADD 2 // (S)tart..(A)ddr..(D)ata..(n)..(D)ata
//#define CMD(ENABLE) (CSL_I2C_CMD_##ENABLE)
CSL_I2cObj i2cObj;
void sI2c_init(CSL_I2cHandle* shI2c);
void I2C_init(CSL_I2cHandle hI2c);
/*Int16 OSK5912_LED(Uint8 regnum,Uint8 regval);*/
void OSK5912_LED_on(CSL_I2cHandle hI2c);
void OSK5912_LED_off(CSL_I2cHandle hI2c);
Int16 OSK5912_POWER_rget(CSL_I2cHandle hI2c, Uint8 regnum, Uint8 *regval );
Int16 OSK5912_POWER_rset(CSL_I2cHandle hI2c, Uint8 regnum, Uint8 regval );
void OSK5912_LED_toggle(CSL_I2cHandle hI2c);
Uint16 OSK5912_I2C_write(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length);
Uint16 OSK5912_I2C_read(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length);
//CSL_I2cHandle hI2c;
//CSL_I2cObj i2cObj;
//CSL_Status status;
void I2C_test()
{ Uint16 i,j,b;
CSL_I2cHandle hI2c;
sI2c_init(&hI2c);
//CSL_I2cObj i2cObj;
//CSL_Status status;
//CSL_i2cInit(NULL);
//hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);
I2C_init(hI2c);
//OSK5912_LED(0x10,0x22);/*shut on D3*/
OSK5912_LED_off(hI2c);
//OSK5912_LED(0x10,0x20);
for(b=0;b<=100;b++)
{
OSK5912_LED_toggle(hI2c);
for(i=0;i<=1000;i++)
for(j=0;j<=500;j++)
{
}
}
CSL_i2cClose(hI2c);
}
void I2C_init(CSL_I2cHandle hI2c)
{
CSL_I2cHwSetup i2csetup;
CSL_I2cClkSetup clksetup;
Uint16 response = 0x0;
i2csetup.mode = CSL_I2C_MODE_MASTER;
i2csetup.dir = CSL_I2C_DIR_TRANSMIT;
i2csetup.addrMode = CSL_I2C_ADDRSZ_SEVEN;
i2csetup.endianess = CSL_I2C_ENDIAN_LITTLE;
i2csetup.sttbyteen = CSL_I2C_STB_DISABLE;
i2csetup.ownaddr = 0xcc;
i2csetup.txdmaen = CSL_I2C_TX_DMA_DISABLE;
i2csetup.rxdmaen = CSL_I2C_RX_DMA_DISABLE;
i2csetup.inten = 0x00;
clksetup.prescalar = 0;
clksetup.clklowdiv = 9;
clksetup.clkhighdiv = 9;
i2csetup.clksetup = &clksetup;
*(Uint32 *) 0xFFFECE08 |= 0x6; /*ARM_IDLECT2 ARMXOR Clk */
//CSL_i2cInit(NULL);
//sI2c_init(&hI2c);
/* Open the peripheral */
//hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_RESET ,NULL);
/* Enable I2c */
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
/* Wait for the reset completion */
do {
if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RDONE, &response) != CSL_SOK){
printf("Error reading the status\n");
return ;
}
}while(response != CSL_I2C_RESET_DONE);
/* Setup the I2C module */
CSL_i2cHwSetup(hI2c, &i2csetup);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
//CSL_i2cClose(hI2c);
}
void sI2c_init(CSL_I2cHandle* shI2c)
{ CSL_Status status;
CSL_i2cInit(NULL);
* shI2c=CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);
}
void OSK5912_LED_off(CSL_I2cHandle hI2c)
{
Uint8 regval;
/* Turn D3 - OFF * TPS65010 GPIO2 control*/
OSK5912_POWER_rget(hI2c, 0x10, ®val );
OSK5912_POWER_rset(hI2c, 0x10, 0xDD & regval );
}
void OSK5912_LED_on(CSL_I2cHandle hI2c)
{
Uint8 regval;
/* Turn D3 - ON */
OSK5912_POWER_rget(hI2c, 0x10, ®val );
OSK5912_POWER_rset(hI2c, 0x10, 0x22 | regval );
}
Int16 OSK5912_POWER_rget(CSL_I2cHandle hI2c, Uint8 regnum, Uint8 *regval )
{
Uint16 status = 0;
Uint8 buffer8[1];
buffer8[0] = regnum;
status |= OSK5912_I2C_write(hI2c, OSK5912_POWER_I2C_ADDR, buffer8, 1 );
status |= OSK5912_I2C_read(hI2c,OSK5912_POWER_I2C_ADDR, buffer8, 1 );
*regval = buffer8[0];
return status;
}
Int16 OSK5912_POWER_rset(CSL_I2cHandle hI2c, Uint8 regnum, Uint8 regval )
{
Uint8 buffer8[2];
buffer8[0] = regnum;
buffer8[1] = regval;
return OSK5912_I2C_write(hI2c, OSK5912_POWER_I2C_ADDR, buffer8, 2 );
}
/*Int16 OSK5912_LED(Uint8 regnum,Uint8 regval)
{ Uint8 buffer[2];
buffer[0]=regnum;
buffer[1]=regval;
return OSK5912_I2C_write(OSK5912_POWER_I2C_ADDR,buffer,2);
}*/
void OSK5912_LED_toggle(CSL_I2cHandle hI2c)
{ /*Uint8 regval;*/
/*OSK5912_POWER_rget(0x10,®val);*/
/* Uint8 buffer[1];
buffer[0]=0x10;
OSK5912_I2C_write(OSK5912_POWER_I2C_ADDR,buffer,1);
OSK5912_I2C_read(OSK5912_POWER_I2C_ADDR,buffer,1);
regval=buffer[0];
if(regval&0x02==0)*/
/*OSK5912_LED(0x10,0x22);*/ /*shut on D3*/
/*else OSK5912_LED(0x10,0x20);*/ /*shut off d3*/
Uint8 regval;
OSK5912_POWER_rget(hI2c, 0x10, ®val );
if ( ( ( regval & 0x20 ) == 0 ) || ( ( regval & 0x02 ) == 0 ) )
OSK5912_LED_on(hI2c);
else
OSK5912_LED_off(hI2c);
}
Uint16 OSK5912_I2C_write(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length)
{
//CSL_I2cHandle hI2c;
//CSL_I2cObj i2cObj;
Uint16 *pdata =(Uint16*)data; //saaddr=0x48;
Uint16 last_byte=(data[length-1]&0xFF);
//Uint16 status;
Int16 i, timecount,timeout=0x1000;
Uint16 response;
Uint16 cmdclear;
//Uint16 cmden;
//CSL_i2cInit(NULL);
//hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_SLAVE_ADDR,(Uint16*)&slave_addr);
//I2C_SA = slave_addr;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_DATA_COUNT,(Uint16*)&length);
//I2C_CNT = length;
/* Wait for the transfer to start */
do{
if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response) != CSL_SOK){
printf("Error reading bus busy status\n");
return 0;
}
}while(response == CSL_I2C_BUS_BUSY);
//CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response);
/*for ( i = 0 ; respon == CSL_I2C_BUS_BUSY ; i++ )
{ CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response);
if ( i > timeout )
{ CSL_i2cClose(hI2c);
return 2001;
}
}*/
/*for ( i = 0 ; I2C_STAT & I2C_STAT_BB ; i++ )
if ( i > timeout )
return 2001;*/
//cmden=CMD(ENABLE)|CMD(MODE_MASTER)|CMD(DIR_TRANSMIT);
//CSL_i2cHwControl(hI2c,cmden,NULL);
//I2C_CON = 0;
printf("succss\n");
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_MODE_MASTER,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_DIR_TRANSMIT,NULL);
/*I2C_CON = 0
|I2C_CON_I2C_EN // I2C Enable
|I2C_CON_MST // Master Mode
|I2C_CON_TX // Transmit Mode
;*/
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_START,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_STOP,NULL);
//I2C_CON |= OSK5912_I2C_MODE_SADP;
for ( timecount = 0 ; timecount < timeout ; timecount++ )
{
/* Read I2C Status register */
// status = I2C_STAT;
/* Check for NACK */
CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_NACK, &response);
//status = I2C_STAT;
if ( response != 0x0001 )
//if(( status & I2C_STAT_NACK ) != I2C_STAT_NACK)
{
/* Check for ARDY */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
if ( response != CSL_I2C_ACS_READY )
//if(( status & I2C_STAT_ARDY ) != I2C_STAT_ARDY)
{
/* Check for XRDY */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_TX_RDY, &response);
if ( response == CSL_I2C_TX_READY )
//if(( status & I2C_STAT_XRDY ) == I2C_STAT_XRDY)
{
/* Send Data */
if ( length == 1 )
{
//I2C_DATA = last_byte;
CSL_i2cWrite(hI2c, &last_byte);
length--;
}
else
{
CSL_i2cWrite(hI2c,pdata) ;
//I2C_DATA = *pdata++;
pdata++;
length -= 2;
}
/* Clear Transmit Ready field */
//I2C_STAT &= I2C_STAT_XRDY;
do{cmdclear=CSL_I2C_CLEAR_XRDY;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_TX_RDY, &response);
}
while(response==CSL_I2C_TX_READY);
}
}
/* Check for Errors - refresh status register */
//status = I2C_STAT;
/* Check for Arbitration Lost */
//status = I2C_STAT;
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_AL, &response);
if ( response == CSL_I2C_ARBITRATION_LOST )
//if(( status & I2C_STAT_AL ) == I2C_STAT_AL)
{ //CSL_i2cClose(hI2c);
//I2C_STAT &= I2C_STAT_AL;
return 1001;
}
/* Check for NACK */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_NACK, &response);
if ( CSL_I2C_QUERY_NACK == 0x0001 )
//if(( status & I2C_STAT_NACK ) == I2C_STAT_NACK)
{ //CSL_i2cClose(hI2c);
//I2C_STAT &= I2C_STAT_NACK;
return 1002;
}
/* Check for Register Access Ready - Good Condition */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
if ( response == CSL_I2C_ACS_READY )
{ do{cmdclear=CSL_I2C_CLEAR_ARDY;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);}
while(response==CSL_I2C_ACS_READY);
//CSL_i2cClose(hI2c);
//I2C_STAT &= I2C_STAT_ARDY;
return 0;
}
/*if ( ( I2C_STAT & I2C_STAT_ARDY ) == I2C_STAT_ARDY )
{
I2C_STAT &= I2C_STAT_ARDY;
return 0;
}*/
}
}
//CSL_i2cClose(hI2c);
/* I2C Timeout */
return 2002;
}
Uint16 OSK5912_I2C_read(CSL_I2cHandle hI2c, Uint16 slave_addr, Uint8* data, Uint16 length )
{
Uint16 *pdata = ( Uint16 * )data;
//Uint16 status;
Int16 i, timecount, timeout = 0x1000;
Uint16 response;
Uint16 cmdclear;
/* Set slave address */
//I2C_SA = slave_addr;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_SLAVE_ADDR,&slave_addr);
/* Set data count */
//I2C_CNT = length;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_DATA_COUNT,&length);
/* Poll BB field on I2C_STAT - Wait for bus to become free */
/*for ( i = 0 ; I2C_STAT & I2C_STAT_BB ; i++ )
if ( i > timeout )
return 2001;*/
do{
if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response) != CSL_SOK){
printf("Error reading bus busy status\n");
return 0;
}
}while(response == CSL_I2C_BUS_BUSY);
/* Configure Options for Receiving - Master Reciever mode */
/*I2C_CON = 0
| I2C_CON_I2C_EN // I2C Enable
| I2C_CON_MST // Master Mode
| I2C_CON_RX // Receive Mode
;*/
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_MODE_MASTER,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_DIR_RECEIVE,NULL);
/* Set mode:
* OSK5912_I2C_MODE_SADP // (S)tart..(A)ddr..(D)ata..(n)..sto(P)
* OSK5912_I2C_MODE_SADD // (S)tart..(A)ddr..(D)ata..(n)..(D)ata */
//I2C_CON |= OSK5912_I2C_MODE_SADP;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_START,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_STOP,NULL);
/* Poll until complete */
for ( timecount = 0 ; timecount < timeout ; timecount++ )
{
/* Read I2C Status register */
//status = I2C_STAT;
/* Check for NACK */
CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_NACK, &response);
//if ( ( status & I2C_STAT_NACK ) != I2C_STAT_NACK )
if ( response != 0x0001 )
{
/* Check for ARDY */
//if ( ( status & I2C_STAT_ARDY ) != I2C_STAT_ARDY )
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
if ( response != CSL_I2C_ACS_READY )
{
/* Check for RRDY */
//if ( ( status & I2C_STAT_RRDY ) == I2C_STAT_RRDY )
CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RX_RDY, &response);
if ( response == CSL_I2C_RX_READY )
{
/* Read Data */
if ( length == 1 )
{
//*pdata = I2C_DATA & 0xFF;
CSL_i2cRead(hI2c,pdata);
*pdata=*pdata&0xFF;
length--;
}
else
{
//*pdata++ = I2C_DATA;
CSL_i2cRead(hI2c,pdata);
pdata++;
length -= 2;
}
/* Clear Receive Ready field */
//I2C_STAT &= I2C_STAT_RRDY;
do{cmdclear=CSL_I2C_CLEAR_RRDY;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RX_RDY, &response);}
while(response==CSL_I2C_RX_READY);
}
}
/* Check for Errors - refresh status register */
//status = I2C_STAT;
/* Check for Arbitration Lost */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_AL, &response);
//if ( ( status & I2C_STAT_AL ) == I2C_STAT_AL )
if ( response == CSL_I2C_ARBITRATION_LOST )
{
//I2C_STAT &= I2C_STAT_AL;
return 1001;
}
/* Check for NACK */
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_NACK, &response);
//if ( ( status & I2C_STAT_NACK ) == I2C_STAT_NACK )
if ( response == 0x0001 )
{
//I2C_STAT &= I2C_STAT_NACK;
return 1002;
}
/* Check for Register Access Ready - Good Condition */
//if ( ( I2C_STAT & I2C_STAT_ARDY ) == I2C_STAT_ARDY )
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);//why ARDY!=1?
if ( response == CSL_I2C_ACS_READY )
{ do{cmdclear=CSL_I2C_CLEAR_ARDY;
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);}
while(response==CSL_I2C_ACS_READY);
/*{
I2C_STAT &= I2C_STAT_ARDY;
return 0;
}*/
return 0;
}
}
}
/* I2C Timeout */
return 2002;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -