应用McBSP实现I2C总线控制器
定义好之后可以模拟I2C总线的协议进行传送,例如在SAA7111A上的I2C总线接口是用来对SAA7111A进行初始化用的,SCL的频率可以从0到400KHZ,为了控制SCL的频率可以应用DSP的TIMER0来控制。
当CPU为100MHZ时:
TCR = 0x00000010; // 停止 TIMER0 and TDDR=0
PRD = 6249; // TIMER0 rate = CPU-Frequency/(PDR+1) = 100MHz/6250 = 16kHz
...
TCR &= 0xFFFFFFEF; // 开始 TIMER0
3.2 I2C总线协议编程
3.2.1 I2C总线协议读写数据流的编程
为了进行I2C总线的通讯,我们选用每位数据流4帧(FRAMES),以便延迟和噪声干扰最小,4帧每位的数据流保证了SDA不会变化在SCL的边沿处,仅仅允许数据变化在FRAME0,读仅在FR
AME2。如图2所示
I2C总线的写程序如下
void I2CWrite(unsigned int WriteBit)
{Set_SDADirOut( ); // 设置SDA为输出
switch(FrameCount)
{
case(0): // 起始帧
Set_SCLLo( ); // SCL 为 0
if (WriteBit == 0) // SDA = WriteBit
Set_SDALo( );
else
Set_SDAHi( );
break;
case(3): // 第4帧
Set_SCLLo( ); //
break;
default: // 在第2,3帧
Set_SCLHi( ); // SCL 为 1
}
FrameCount += 1; // 帧计数
if (FrameCount > 3)
{
FrameCount = 0;
BitIndex = (BitIndex >> 1); } // 准备下一个发送位
}
I2C总线的读程序与写程序很类似,只需要改变SDA为输入即可。
3.2.2 I2C总线的开始位和停止位的编程
I2C总线的开始位和停止位有3帧产生,在I2C总线传输过程中,仅当总线空闲(SCL线和SDA线均为高电平)时,数据传送才能开始,此时总线上的任何器件均可以控制总线。其中当SCL线为高电平且SDA线由高变低时为开始条件;而当SCL线为高电平且SDA线由低变高时为结束条件。如图3所示
开始位:
void I2CSTA ( )
{ // I2C 开始位
Set_SDADirOut ( );//定义SDA为输出
switch ( FrameCount )
{
case (1): // 第2帧
Set_SCLHi ( );
Set_SDALo( );
break;
case (2): // 第三帧
Set_SCLLo ( );
Set_SDALo( );
break;
default: // 第一帧
Set_SCLHi ( );
Set_SDAHi ( );
}
FrameCount += 1; // 帧计数
if ( FrameCount > 2 )
{
FrameCount = 0;
BitIndex = 0x0080; } // 定义的低8位
}
停止位的编程方法只需要按照上面所说的将SCL线为高电平且SDA线由低变高即可。
3.2.3 I2C总线的数据格式
起始位 受控器件地址 读写控制位0/1 应答位 数据 应答位 … 停止位
I2C总线数据传输格式[3]如图4。其中第一部分为数据传输起始信号,即由此开始进行数据传送;第二部分为受控器地址,用来选择向哪个受控器传送数据;第三部分为读/写控制位,用于指示受控器的工作方式,0表示写,1表示读;第四部分是被主控器选中的受控器向主控器回传的确认信号;第五部分是所传送的数据,每传送一个字节数据,都要求有一个应答位;第六部分是数据传输的结束信号。每个具有I2C总线接口的受控器件都有唯一固定的地址,当主控器发送数据
《应用McBSP实现I2C总线控制器(第2页)》