硬件的I
采用的芯片:MSP
设备地址:BH1710(写地址0x46,读地址0x47),AT
工程文件:(采取模块化方法,只需添加I
接口电路:
一般情况下,大家在调试I
于是我开始鼓捣硬件的I
可以看出,I
初始化过程的大致顺序为将USART设置为I
SCL的频率则由I2CPSC、I2CSCLH、I2CSCLL共同决定。I2CPSC为预分频,I2CPSC=0时为一分频,I2CPSC=1时为二分频,最高只支持4分频。I2CSCLH和I2CSCLL分别表示SCL高电平和低电平的持续时间,实际时间TH= (I2CPSC +1) x (I2CSCLH + 2),需要什么频率可以自己算,同时也可以为函数增加一个freq参数,在初始化的时候设置频率。请注意根据手册上的说明,I2CIN输入的时钟源频率至少要等于10*SCL* I2CPSC分频数,至于不这么干会怎样,大家可以试试呀。
void I
{
I
I
U0CTL |= I
U0CTL &= ~I2CEN; //配置I
//这里采用默认配置,7位地址,无DMA,无反馈
I2CTCTL = I2CTRX+I2CSSEL_2; //byte模式,repeat模式,I
I2CSA = slaveAddress; //设置从设备地址
I2COA = 0xAA; //本机地址,这个目前用不到
I2CPSC = 0x01; //I
I2CSCLH = 0x18; //SCL高电平周期 = 20*I
I2CSCLL = 0x18; //SCL低电平周期 = 20*I
//I
U0CTL |= I2CEN; //开启I
if (I2CDCTL&I2CBUSY) //检查I
{
I
I
I
I
};
}
发送数据以BH1710写入指令函数为例,向I
Start |
SlaveAddress |
W |
ACK |
Data |
ACK |
Stop |
void BH_WriteCmd(unsigned char Cmd)
{
while (I2CDCTL&I2CBUSY);
I2CBufferArray[0] = Cmd;
PtrTransmit = 0;
I
I2CNDAT = 1;
I2CTCTL |= I2CSTT;
__bis_SR_register(LPM0_bits + GIE);
I2CTCTL |= I2CSTP;
while(I2CTCTL & I2CSTP);
}
其中I2CNDAT用于指定发送数据的字节数,I2CSTT位设定开始发送, I2CSTP位设定发送结束。在这里,发送函数只是将数据填入缓存中,实际的发送过程在__interrupt void ISR_I
读取函数与发送函数类似,依然已BH1710为例:
unsigned int BH_Resualt(void)
{
unsigned char byteHight,byteLow;
while (I2CDCTL&I2CBUSY); //等待I
I
I2CNDAT = 2; //读取2字节
I2CTCTL |= I2CSTT; //发送Start开始接收
__bis_SR_register(LPM0_bits + GIE); //进入休眠等待
byteHight = I2CBuffer; //高位数据
__bis_SR_register(LPM0_bits + GIE);
byteLow = I2CBuffer; //低位数据
I2CTCTL |= I2CSTP; //发送Stop结束接收
while(I2CTCTL & I2CSTP); //等待Stop发送完毕
return ((((unsigned int)byteHight)<<8)+byteLow);//合成数据
}
需要注意的是,BH1710一次返回两个字节数据,需令I2CNDAT = 2,同时在读完一次缓存后再读取下一个。
对于AT
最后是中断函数:
#pragma vector=USART0TX_VECTOR
__interrupt void ISR_I
{
switch (__even_in_range(I2CIV, I2CIV_STT))
{
case I2CIV_RXRDY: //接收就绪 (RXRDYIFG)
I2CBuffer = I2CDRB; //读取数据,跳出休眠
__bic_SR_register_on_exit(LPM0_bits);
break;
case I2CIV_TXRDY: //发送就绪 (TXRDYIFG)
while(!(I2CDCTL & I2CTXUDF)); //等待上一个数据发送完毕
I2CDRB = I2CBufferArray[PtrTransmit]; //发送Buff中的数据
PtrTransmit--;
if (PtrTransmit < 0) //PtrTransmit为发送数据个数的自减计数器,减完表示发送结束
{
I2CIE &= ~TXRDYIE; //最后清标志位
I2CIFG &= ~TXRDYIFG;
__bic_SR_register_on_exit(LPM0_bits);
}
break;
}
}
I
参考:Interfacing an EEPROM via I
MSP430x1xx User's Guide
学习了, 不错的资料