Technical discussions about the TI C6000 DSPs (including the c62x, c64x and c67x DSPs).
Hi!
I am trying to run the I2C Module. Until now I had no luck, neither by using the csl module
(csl_i2c.h and csl_i2chal) nor by manually setting.
Problem is: I even never can measure a scl clock at the SCL0 pin of the HPI expansion
connector. The whole time the clock is stuck at high (3.3V), until I request a start-condition,
either by manually setting STT of the I2C mode register (_I2C_I2CMDR0_FSET(STT,1);//start
condition) or by csl: I2C_start(hI2C);. After that it will be stuck at zero and wonīt move.
Hereīs my source code:
void initManually(void){
_I2C_I2CMDR0_FSET(IRS,0);
//################# set clk prescalers, I2C module must be in reset state!
// module clk prescaler:
_I2C_I2CPSC0_FSET(IPSC,0x00);
LOG_printf(&LOG0,"module clk prescaler register: %x",_I2C_I2CPSC0_FGET(IPSC));
// master clk prescaler:
_I2C_I2CCLKL0_FSET(ICCL,0x08CA);
LOG_printf(&LOG0,"master clk low time register: %x",_I2C_I2CCLKL0_FGET(ICCL));
_I2C_I2CCLKH0_FSET(ICCH,0x08CA);
LOG_printf(&LOG0,"master clk high time register:
%x",_I2C_I2CCLKH0_FGET(ICCH));
_I2C_I2CMDR0_FSET(IRS,1);
LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
_I2C_I2CMDR0_FSET(IRS,1);
LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
_I2C_I2CCLKL0_FSET(ICCL,0x08CA);
_I2C_I2CCLKH0_FSET(ICCH,0x08CA);
//##################### mode register #####################
_I2C_I2CMDR0_FSET(NACKMOD,0); //ack bit after every byte
_I2C_I2CMDR0_FSET(FREE,1); //donī react on breakpoints
_I2C_I2CMDR0_FSET(MST,1); //master mode
_I2C_I2CMDR0_FSET(XA,0); //use 7bit addressing mode
_I2C_I2CMDR0_FSET(RM,1); //use repeat mode
_I2C_I2CMDR0_FSET(FDF,0); //disable free data mode
_I2C_I2CMDR0_FSET(BC,0x0); //8bit send mode
LOG_printf(&LOG0,"\nmode register: ");
LOG_printf(&LOG0," NACKMOD : %d",_I2C_I2CMDR0_FGET(NACKMOD));
LOG_printf(&LOG0," FREE : %d",_I2C_I2CMDR0_FGET(FREE));
LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
//##################### initialized ##########################
}
void initByCSL(void){
Uint32 i2cStatus=0;
// ############ start I2C module ###############
I2C_Config config = {
_I2C_I2COAR0_ADDR,
_I2C_I2CIER0_ADDR,
_I2C_I2CCLKL0_ADDR,
_I2C_I2CCLKH0_ADDR,
_I2C_I2CCNT0_ADDR,
_I2C_I2CSAR0_ADDR,
_I2C_I2CMDR0_ADDR,
_I2C_I2CPSC0_ADDR
};
CSL_init();
hI2C = I2C_open(0,I2C_OPEN_RESET);
LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
I2C_config(hI2C,&config);
I2C_outOfReset(hI2C);
LOG_printf(&LOG0,"\nmode register: ");
LOG_printf(&LOG0," NACKMOD: %d",_I2C_I2CMDR0_FGET(NACKMOD));
LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
I2C_start(hI2C);
I2C_writeByte(hI2C,0xAA);
}
Iīd be grateful for ANY suggestions! Further I am lacking additional information on the csl i2c
module. SPRU175B isnīt exactly offering a lot of infos on what functions as I2C_start() are
doing in detail.
Thank you!
Andreas
Maby this will help.
I had same problem with documentation I2C module.
I give you some code but to understand it better i would sugest reading csl=
=20
help, hal macros help, i2c module help.
This code should work but, if you don't get ACK- (acknowledge) from slave
I2C module stops transmiting and waits for ACK.
You should check configuration of the device becouse I don't remeber how I
done it but it worked. :)
This code should send two data bytes to slave of adress 0x55 (85 Dec) or 10=
1
0101 binary.
And I posted it some time ago on DSP Forum :). So it is probly still there.
###code
#include <csl_i2c.h>
void I2C_6713_Open(void);
void I2C_6713_Init(Uint32 address);
void I2C_START_Send(void);
void I2C_STOP_Send(void);
void I2C_START_Receiver(void);
void I2C_Write_Byte (unsigned char *source,unsigned int len);
void I2C_Read_Byte(unsigned char *source,unsigned int len);
void I2C_NACK_Clear();
// I2C open/reset
void I2C_6713_Open(void)
{
I2C_RSET(I2COAR0,I2C_I2COAR_DEFAULT); //
I2C_RSET(I2CIMR0,I2C_I2CIMR_DEFAULT); //
I2C_RSET(I2CCLKL0,I2C_I2CCLKL_DEFAULT); //
I2C_RSET(I2CCLKH0,I2C_I2CCLKH_DEFAULT); //
I2C_RSET(I2CCNT0,I2C_I2CCNT_DEFAULT); //
I2C_RSET(I2CSAR0,I2C_I2CSAR_DEFAULT); //
I2C_RSET(I2CMDR0,I2C_I2CMDR_DEFAULT); //
I2C_RSET(I2CPSC0,I2C_I2CPSC_DEFAULT); //
}
// I2c_init
void I2C_6713_Init (Uint32 address)
{
// 0;
I2C_RSET(I2COAR0,I2C_I2COAR_RMK(I2C_I2COAR_A_OF(0)));
//
I2C_RSET(I2CIMR0,I2C_I2CIMR_RMK(I2C_I2CIMR_ICXRDY_MSK,
I2C_I2CIMR_ICRRDY_MSK,
I2C_I2CIMR_ARDY_MSK,
I2C_I2CIMR_NACK_MSK,
I2C_I2CIMR_AL_MSK));
// SCLK
I2C_RSET(I2CCLKL0,I2C_I2CCLKL_RMK(I2C_I2CCLKL_ICCL_OF(100-6)));
I2C_RSET(I2CCLKH0,I2C_I2CCLKH_RMK(I2C_I2CCLKH_ICCH_OF(100-6)));
// ,
I2C_RSET(I2CCNT0,I2C_I2CCNT_RMK(I2C_I2CCNT_ICDC_OF(0)));
//
I2C_RSET(I2CSAR0,I2C_I2CSAR_RMK(I2C_I2CSAR_A_OF(0)));
//
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_NONE,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_RST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
// I2C IRS=3D0
I2C_RSET(I2CPSC0,I2C_I2CPSC_RMK(I2C_I2CPSC_IPSC_OF(20-1)));
// I2C out of reset
//
I2C_RSET(I2CMDR0,I2C_RGET(I2CMDR0)|_I2C_I2CMDR_IRS_MASK);
// clear BB in case of malfunction slave device
// 1
I2C_RSET(I2CSTR0,_I2C_I2CSTR_BB_MASK);
// Setup Procedure is over;
// prepare send
I2C_RSET(I2CSAR0,I2C_I2CSAR_RMK(I2C_I2CSAR_A_OF(address)));
// I2C_RSET(I2CCNT0,I2C_I2CCNT_RMK(I2C_I2CCNT_ICDC_OF(number)));
// I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*source)));
}
// starting I2C
void I2C_START_Send(void)
{
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=3D0);
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
//OLD I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_STOP,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
}
void I2C_START_Receiver(void)
{
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_RCV,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=3D0);
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_STOP,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_RCV,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
}
void I2C_NACK_Clear()
{
I2C_FSETS(I2CSTR0,NACK,INT);
}
void I2C_Write_Byte (unsigned char *source,unsigned int len)
{
while(len>0)
{
if ((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICXRDY_MASK)!=3D0)
{
I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*source++)));
len--;
}
}
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=3D0); //
}
void I2C_Read_Byte(unsigned char *source,unsigned int len)
{
while(len>0)
{
if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=3D0)
{
*source++=3DI2C_RGET(I2CDRR0);
len--;
}
}
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=3D0); //
}
void main()
{
unsigned char data[]=3D{0xAA,0xAA};
unsigned int length=3D1;
Uint32 address=3D0x55;
I2C_6713_Open();
I2C_6713_Init(address);
I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*data)));
I2C_START_Send();
I2C_Write_Byte (data,length);
return;
}
###end code
----- Original Message -----=20
From: "Douglas Pederick" <d...@gmail.com>
To: <c...@yahoogroups.com>
Sent: Saturday, May 06, 2006 3:06 PM
Subject: [c6x] I2C and SPRU175B
> Hello,
> I'm trying to work through SPRU175B (DSP Inter-Integrated Circuit (I2C)
> Module Reference Guide) and the lack of programming examples is killing
> me.
> The flow charts reference "reprogram MMRs". The term MMRs does not appea=
r
> elsewhere in the document.
> What are MMRs in this context?
> The total lack of platform programming examples generally, and from TI in
> particular, seems really odd to me, when considering such generic tasks a=
s
> reading/writing to a standard eeprom or writing characters to a display
> module is made into an epic task to develop.
> Thanks for any suggestions, insights, code.
> Doug
----- Original Message -----=20
From: <a...@gmx.net>
To: <c...@yahoogroups.com>
Sent: Monday, June 19, 2006 6:02 PM
Subject: [c6x] 6713 I2C Module
> Hi!
> I am trying to run the I2C Module. Until now I had no luck, neither by=20
> using the csl module (csl_i2c.h and csl_i2chal) nor by manually setting.
> Problem is: I even never can measure a scl clock at the SCL0 pin of the=20
> HPI expansion connector. The whole time the clock is stuck at high (3.3V)=
,
> until I request a start-condition, either by manually setting STT of the=
=20
> I2C mode register (_I2C_I2CMDR0_FSET(STT,1);//start condition) or by csl:=
=20
> I2C_start(hI2C);. After that it will be stuck at zero and won=B4t move.
> Here=B4s my source code:
>
> void initManually(void){
> _I2C_I2CMDR0_FSET(IRS,0);
> //################# set clk prescalers, I2C module must be in reset state=
!
> // module clk prescaler:
> _I2C_I2CPSC0_FSET(IPSC,0x00);
> LOG_printf(&LOG0,"module clk prescaler register:=20
> %x",_I2C_I2CPSC0_FGET(IPSC));
> // master clk prescaler:
> _I2C_I2CCLKL0_FSET(ICCL,0x08CA);
> LOG_printf(&LOG0,"master clk low time register:=20
> %x",_I2C_I2CCLKL0_FGET(ICCL));
> _I2C_I2CCLKH0_FSET(ICCH,0x08CA);
> LOG_printf(&LOG0,"master clk high time register:=20
> %x",_I2C_I2CCLKH0_FGET(ICCH));
> _I2C_I2CMDR0_FSET(IRS,1);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> _I2C_I2CMDR0_FSET(IRS,1);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> _I2C_I2CCLKL0_FSET(ICCL,0x08CA);
> _I2C_I2CCLKH0_FSET(ICCH,0x08CA);
>
> //##################### mode register #####################
> _I2C_I2CMDR0_FSET(NACKMOD,0); //ack bit after every byte
> _I2C_I2CMDR0_FSET(FREE,1); //don=B4 react on breakpoints
> _I2C_I2CMDR0_FSET(MST,1); //master mode
> _I2C_I2CMDR0_FSET(XA,0); //use 7bit addressing mode
> _I2C_I2CMDR0_FSET(RM,1); //use repeat mode
> _I2C_I2CMDR0_FSET(FDF,0); //disable free data mode
> _I2C_I2CMDR0_FSET(BC,0x0); //8bit send mode
> LOG_printf(&LOG0,"\nmode register: ");
> LOG_printf(&LOG0," NACKMOD : %d",_I2C_I2CMDR0_FGET(NACKMOD));
> LOG_printf(&LOG0," FREE : %d",_I2C_I2CMDR0_FGET(FREE));
> LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
> LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
> LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
> LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
> LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
>
> //##################### initialized ##########################
>
> }
>
> void initByCSL(void){
> Uint32 i2cStatus=3D0;
> // ############ start I2C module ###############
> I2C_Config config =3D {
> _I2C_I2COAR0_ADDR,
> _I2C_I2CIER0_ADDR,
> _I2C_I2CCLKL0_ADDR,
> _I2C_I2CCLKH0_ADDR,
> _I2C_I2CCNT0_ADDR,
> _I2C_I2CSAR0_ADDR,
> _I2C_I2CMDR0_ADDR,
> _I2C_I2CPSC0_ADDR
> };
> CSL_init();
> hI2C =3D I2C_open(0,I2C_OPEN_RESET);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> I2C_config(hI2C,&config);
> I2C_outOfReset(hI2C);
> LOG_printf(&LOG0,"\nmode register: ");
> LOG_printf(&LOG0," NACKMOD: %d",_I2C_I2CMDR0_FGET(NACKMOD));
> LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
> LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
> LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
> LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
> LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
>
> I2C_start(hI2C);
>
> I2C_writeByte(hI2C,0xAA);
>
> }
>
> I=B4d be grateful for ANY suggestions! Further I am lacking additional=20
> information on the csl i2c module. SPRU175B isn=B4t exactly offering a lo=
t=20
> of infos on what functions as I2C_start() are doing in detail.
>
> Thank you!
> Andreas
=20
Hello Krzysztof!
"This code should work but, if you don't get ACK- (acknowledge) from slave
I2C module stops transmiting and waits for ACK."
This seems to be the problem I am stuck at. Thank you for your help!
Regards,
Andreas
----- Original Message -----
From: "Krzysztof Kanas" <k...@o2.pl>
To: <a...@gmx.net>; <c...@yahoogroups.com>
Sent: Wednesday, June 21, 2006 5:24 PM
Subject: Re: [c6x] 6713 I2C Module
Maby this will help.
I had same problem with documentation I2C module.
I give you some code but to understand it better i would sugest reading csl
help, hal macros help, i2c module help.
This code should work but, if you don't get ACK- (acknowledge) from slave
I2C module stops transmiting and waits for ACK.
You should check configuration of the device becouse I don't remeber how I
done it but it worked. :)
This code should send two data bytes to slave of adress 0x55 (85 Dec) or 101
0101 binary.
And I posted it some time ago on DSP Forum :). So it is probly still there.
###code
#include <csl_i2c.h>
void I2C_6713_Open(void);
void I2C_6713_Init(Uint32 address);
void I2C_START_Send(void);
void I2C_STOP_Send(void);
void I2C_START_Receiver(void);
void I2C_Write_Byte (unsigned char *source,unsigned int len);
void I2C_Read_Byte(unsigned char *source,unsigned int len);
void I2C_NACK_Clear();
// I2C open/reset
void I2C_6713_Open(void)
{
I2C_RSET(I2COAR0,I2C_I2COAR_DEFAULT); //
I2C_RSET(I2CIMR0,I2C_I2CIMR_DEFAULT); //
I2C_RSET(I2CCLKL0,I2C_I2CCLKL_DEFAULT); //
I2C_RSET(I2CCLKH0,I2C_I2CCLKH_DEFAULT); //
I2C_RSET(I2CCNT0,I2C_I2CCNT_DEFAULT); //
I2C_RSET(I2CSAR0,I2C_I2CSAR_DEFAULT); //
I2C_RSET(I2CMDR0,I2C_I2CMDR_DEFAULT); //
I2C_RSET(I2CPSC0,I2C_I2CPSC_DEFAULT); //
}
// I2c_init
void I2C_6713_Init (Uint32 address)
{
// 0;
I2C_RSET(I2COAR0,I2C_I2COAR_RMK(I2C_I2COAR_A_OF(0)));
//
I2C_RSET(I2CIMR0,I2C_I2CIMR_RMK(I2C_I2CIMR_ICXRDY_MSK,
I2C_I2CIMR_ICRRDY_MSK,
I2C_I2CIMR_ARDY_MSK,
I2C_I2CIMR_NACK_MSK,
I2C_I2CIMR_AL_MSK));
// SCLK
I2C_RSET(I2CCLKL0,I2C_I2CCLKL_RMK(I2C_I2CCLKL_ICCL_OF(100-6)));
I2C_RSET(I2CCLKH0,I2C_I2CCLKH_RMK(I2C_I2CCLKH_ICCH_OF(100-6)));
// ,
I2C_RSET(I2CCNT0,I2C_I2CCNT_RMK(I2C_I2CCNT_ICDC_OF(0)));
//
I2C_RSET(I2CSAR0,I2C_I2CSAR_RMK(I2C_I2CSAR_A_OF(0)));
//
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_NONE,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_RST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
// I2C IRS=0
I2C_RSET(I2CPSC0,I2C_I2CPSC_RMK(I2C_I2CPSC_IPSC_OF(20-1)));
// I2C out of reset
//
I2C_RSET(I2CMDR0,I2C_RGET(I2CMDR0)|_I2C_I2CMDR_IRS_MASK);
// clear BB in case of malfunction slave device
// 1
I2C_RSET(I2CSTR0,_I2C_I2CSTR_BB_MASK);
// Setup Procedure is over;
// prepare send
I2C_RSET(I2CSAR0,I2C_I2CSAR_RMK(I2C_I2CSAR_A_OF(address)));
// I2C_RSET(I2CCNT0,I2C_I2CCNT_RMK(I2C_I2CCNT_ICDC_OF(number)));
// I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*source)));
}
// starting I2C
void I2C_START_Send(void)
{
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=0);
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
//OLD I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_STOP,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_XMT,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
}
void I2C_START_Receiver(void)
{
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_NONE,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_RCV,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=0);
I2C_RSET(I2CMDR0,I2C_I2CMDR_RMK(I2C_I2CMDR_NACKMOD_ACK,
I2C_I2CMDR_FREE_BSTOP,
I2C_I2CMDR_STT_START,
I2C_I2CMDR_STP_STOP,
I2C_I2CMDR_MST_MASTER,
I2C_I2CMDR_TRX_RCV,
I2C_I2CMDR_XA_7BIT,
I2C_I2CMDR_RM_NONE,
I2C_I2CMDR_DLB_NONE,
I2C_I2CMDR_IRS_NRST,
I2C_I2CMDR_STB_NONE,
I2C_I2CMDR_FDF_NONE,
I2C_I2CMDR_BC_BIT8FDF));
}
void I2C_NACK_Clear()
{
I2C_FSETS(I2CSTR0,NACK,INT);
}
void I2C_Write_Byte (unsigned char *source,unsigned int len)
{
while(len>0)
{
if ((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICXRDY_MASK)!=0)
{
I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*source++)));
len--;
}
}
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=0); //
}
void I2C_Read_Byte(unsigned char *source,unsigned int len)
{
while(len>0)
{
if((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_ICRRDY_MASK)!=0)
{
*source++=I2C_RGET(I2CDRR0);
len--;
}
}
while((I2C_RGET(I2CSTR0)&_I2C_I2CSTR_BB_MASK)!=0); //
}
void main()
{
unsigned char data[]={0xAA,0xAA};
unsigned int length=1;
Uint32 address=0x55;
I2C_6713_Open();
I2C_6713_Init(address);
I2C_RSET(I2CDXR0,I2C_I2CDXR_RMK(I2C_I2CDXR_OF(*data)));
I2C_START_Send();
I2C_Write_Byte (data,length);
return;
}
###end code
----- Original Message -----
From: "Douglas Pederick" <d...@gmail.com>
To: <c...@yahoogroups.com>
Sent: Saturday, May 06, 2006 3:06 PM
Subject: [c6x] I2C and SPRU175B
> Hello,
> I'm trying to work through SPRU175B (DSP Inter-Integrated Circuit (I2C)
> Module Reference Guide) and the lack of programming examples is killing
> me.
> The flow charts reference "reprogram MMRs". The term MMRs does not appear
> elsewhere in the document.
> What are MMRs in this context?
> The total lack of platform programming examples generally, and from TI in
> particular, seems really odd to me, when considering such generic tasks as
> reading/writing to a standard eeprom or writing characters to a display
> module is made into an epic task to develop.
> Thanks for any suggestions, insights, code.
> Doug
----- Original Message -----
From: <a...@gmx.net>
To: <c...@yahoogroups.com>
Sent: Monday, June 19, 2006 6:02 PM
Subject: [c6x] 6713 I2C Module
> Hi!
> I am trying to run the I2C Module. Until now I had no luck, neither by
> using the csl module (csl_i2c.h and csl_i2chal) nor by manually setting.
> Problem is: I even never can measure a scl clock at the SCL0 pin of the
> HPI expansion connector. The whole time the clock is stuck at high (3.3V),
> until I request a start-condition, either by manually setting STT of the
> I2C mode register (_I2C_I2CMDR0_FSET(STT,1);//start condition) or by csl:
> I2C_start(hI2C);. After that it will be stuck at zero and wonīt move.
> Hereīs my source code:
>
> void initManually(void){
> _I2C_I2CMDR0_FSET(IRS,0);
> //################# set clk prescalers, I2C module must be in reset state!
> // module clk prescaler:
> _I2C_I2CPSC0_FSET(IPSC,0x00);
> LOG_printf(&LOG0,"module clk prescaler register:
> %x",_I2C_I2CPSC0_FGET(IPSC));
> // master clk prescaler:
> _I2C_I2CCLKL0_FSET(ICCL,0x08CA);
> LOG_printf(&LOG0,"master clk low time register:
> %x",_I2C_I2CCLKL0_FGET(ICCL));
> _I2C_I2CCLKH0_FSET(ICCH,0x08CA);
> LOG_printf(&LOG0,"master clk high time register:
> %x",_I2C_I2CCLKH0_FGET(ICCH));
> _I2C_I2CMDR0_FSET(IRS,1);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> _I2C_I2CMDR0_FSET(IRS,1);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> _I2C_I2CCLKL0_FSET(ICCL,0x08CA);
> _I2C_I2CCLKH0_FSET(ICCH,0x08CA);
>
> //##################### mode register #####################
> _I2C_I2CMDR0_FSET(NACKMOD,0); //ack bit after every byte
> _I2C_I2CMDR0_FSET(FREE,1); //donī react on breakpoints
> _I2C_I2CMDR0_FSET(MST,1); //master mode
> _I2C_I2CMDR0_FSET(XA,0); //use 7bit addressing mode
> _I2C_I2CMDR0_FSET(RM,1); //use repeat mode
> _I2C_I2CMDR0_FSET(FDF,0); //disable free data mode
> _I2C_I2CMDR0_FSET(BC,0x0); //8bit send mode
> LOG_printf(&LOG0,"\nmode register: ");
> LOG_printf(&LOG0," NACKMOD : %d",_I2C_I2CMDR0_FGET(NACKMOD));
> LOG_printf(&LOG0," FREE : %d",_I2C_I2CMDR0_FGET(FREE));
> LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
> LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
> LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
> LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
> LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
>
> //##################### initialized ##########################
>
> }
>
> void initByCSL(void){
> Uint32 i2cStatus=0;
> // ############ start I2C module ###############
> I2C_Config config = {
> _I2C_I2COAR0_ADDR,
> _I2C_I2CIER0_ADDR,
> _I2C_I2CCLKL0_ADDR,
> _I2C_I2CCLKH0_ADDR,
> _I2C_I2CCNT0_ADDR,
> _I2C_I2CSAR0_ADDR,
> _I2C_I2CMDR0_ADDR,
> _I2C_I2CPSC0_ADDR
> };
> CSL_init();
> hI2C = I2C_open(0,I2C_OPEN_RESET);
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
> I2C_config(hI2C,&config);
> I2C_outOfReset(hI2C);
> LOG_printf(&LOG0,"\nmode register: ");
> LOG_printf(&LOG0," NACKMOD: %d",_I2C_I2CMDR0_FGET(NACKMOD));
> LOG_printf(&LOG0," MST : %d",_I2C_I2CMDR0_FGET(MST));
> LOG_printf(&LOG0," XA : %d",_I2C_I2CMDR0_FGET(XA));
> LOG_printf(&LOG0," RM : %d",_I2C_I2CMDR0_FGET(RM));
> LOG_printf(&LOG0," FDF : %d",_I2C_I2CMDR0_FGET(FDF));
> LOG_printf(&LOG0," BC : %d",_I2C_I2CMDR0_FGET(BC));
> LOG_printf(&LOG0," IRS : %d",_I2C_I2CMDR0_FGET(IRS));
>
> I2C_start(hI2C);
>
> I2C_writeByte(hI2C,0xAA);
>
> }
>
> Iīd be grateful for ANY suggestions! Further I am lacking additional
> information on the csl i2c module. SPRU175B isnīt exactly offering a lot
> of infos on what functions as I2C_start() are doing in detail.
>
> Thank you!
> Andreas