📄 i2c_test.c
字号:
/*#include <csl.h>
#include <cslr.h>
#include <soc.h>
#include <csl_i2c.h>
#include <stdio.h>
#include <csl_types.h>
#include <tistdtypes.h>*/
#include <soc.h>
#include <csl_i2c.h>
#include <Osk5912.h>
#include <stdio.h>
#define OSK5912_POWER_I2C_ADDR 0x48
#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)
void I2C_init();
/*Int16 OSK5912_LED(Uint8 regnum,Uint8 regval);*/
void OSK5912_LED_on();
void OSK5912_LED_off();
Int16 OSK5912_POWER_rget( Uint8 regnum, Uint8 *regval );
Int16 OSK5912_POWER_rset( Uint8 regnum, Uint8 regval );
void OSK5912_LED_toggle();
Uint16 OSK5912_I2C_write(Uint16 slave_addr,Uint8* data,Uint16 length);
Uint16 OSK5912_I2C_read(Uint16 slave_addr,Uint8* data,Uint16 length);
void I2C_test()
{ Uint16 i,j;
I2C_init();
//OSK5912_LED(0x10,0x22);/*shut on D3*/
OSK5912_LED_off();
//OSK5912_LED(0x10,0x20);
while(1)
{
OSK5912_LED_toggle();
for(i=0;i<=2000;i++)
for(j=0;j<=2000;j++)
{
}
}
}
void I2C_init()
{ CSL_I2cHandle hI2c;
CSL_I2cHwSetup i2csetup;
CSL_I2cClkSetup clksetup;
CSL_Status status;
CSL_I2cObj i2cObj;
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);
/* 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 OSK5912_LED_off()
{
Uint8 regval;
/* Turn D3 - OFF * TPS65010 GPIO2 control*/
OSK5912_POWER_rget( 0x10, ®val );
OSK5912_POWER_rset( 0x10, 0xDD & regval );
}
void OSK5912_LED_on()
{
Uint8 regval;
/* Turn D3 - ON */
OSK5912_POWER_rget( 0x10, ®val );
OSK5912_POWER_rset( 0x10, 0x22 | regval );
}
Int16 OSK5912_POWER_rget( Uint8 regnum, Uint8 *regval )
{
Uint16 status = 0;
Uint8 buffer8[1];
buffer8[0] = regnum;
status |= OSK5912_I2C_write( OSK5912_POWER_I2C_ADDR, buffer8, 1 );
status |= OSK5912_I2C_read( OSK5912_POWER_I2C_ADDR, buffer8, 1 );
*regval = buffer8[0];
return status;
}
Int16 OSK5912_POWER_rset( Uint8 regnum, Uint8 regval )
{
Uint8 buffer8[2];
buffer8[0] = regnum;
buffer8[1] = regval;
return OSK5912_I2C_write( 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()
{ /*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( 0x10, ®val );
if ( ( ( regval & 0x20 ) == 0 ) || ( ( regval & 0x02 ) == 0 ) )
OSK5912_LED_on();
else
OSK5912_LED_off();
}
/*Uint16 OSK5912_I2C_write(Uint16 slave_addr,Uint8* data,Uint16 length)
{
CSL_I2cHandle hI2c;
CSL_I2cObj i2cObj;
Uint16 *pdata =(Uint16*)data; //saaddr=0x48;
Uint8 last_byte=(data[length-1]&0xFF);// lenth=2;
Int16 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,&slave_addr);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_DATA_COUNT,&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);
/*cmden=CMD(ENABLE)|CMD(MODE_MASTER)|CMD(DIR_TRANSMIT);
CSL_i2cHwControl(hI2c,cmden,NULL);*/
/*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);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_START,NULL);
CSL_i2cHwControl(hI2c,CSL_I2C_CMD_STOP,NULL);
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 ( response != 0x0001 )
{
/* Check for ARDY */
/*CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
if ( response != CSL_I2C_ACS_READY )
{
/* Check for XRDY */
/*CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_TX_RDY, &response);
if ( response == CSL_I2C_TX_READY )
/* {*/
/* Send Data */
/*if ( length == 1 )
{
//I2C_DATA = last_byte;
CSL_i2cWrite(hI2c, &last_byte);
length--;
}
else
{
CSL_i2cWrite(hI2c,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 */
/*CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_AL, &response);
if ( response == CSL_I2C_ARBITRATION_LOST )
{ 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 )
{ 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;
}
}
}/*
CSL_i2cClose(hI2c);
/* I2C Timeout */
/*return 2002;
}*/
/*Uint16 OSK5912_I2C_read(Uint16 slave_addr,Uint8* data,Uint16 length)
{ CSL_I2cHandle hI2c;
CSL_I2cObj i2cObj;
CSL_Status status;
//CSL_I2cHwControlCmd cmden;
Uint16 *pdata = ( Uint16 * )data;
//Uint16 status;
Int16 timecount, timeout = 0x1000;
Uint16 response;
Uint16 cmdclear;
/* Set slave address */
/*I2C_SA = slave_addr;*/
/*CSL_i2cInit(NULL);
hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, NULL);
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 */
/*do{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -