本帖最后由 iversonma 于 2009-8-14 09:05 编辑
采用的是PIC18F65J10系列,使用MSSP1作为IIC主设备读取RTC的数据,但是目前存在的问题是无论做任何操作,IIC的SSP1IF中断位都没有置位,同时用示波器测量IIC总线,也找不到任何的变化,一直都是高电平~基本可以确认是配置的问题,但是IIC前配置就那么几个位,实在是找不到了,麻烦各位帮忙看看~第一次使用PIC的东东,有些东西不太了解。
IIC配置相关的几个地方
1. 相关引脚配置为输入“1”,
2.SSP1CON1配置为0x28(SSPEN为1,SSPM3--0为“1000”)
3. iic总线速度配置,外接时钟为8M,因此配置SSP1ADD为0x13,转为10进制为19,计算可得到IIC总线速度为100k
后续就可以直接发送start信号了~
附上程序:
void main(void)
{
// configure USART
keyboard_init();
uart_232_init();
LED_CLEAN();
I2C1_Init();
do
{
I2C1_Start();
I2C1_SendByte(0xa3);
for(n=0;n<19;n++)
{
arrayrd[n] = I2C1_GetByte();
}
I2C1_Stop();
Delay100TCYx(10);
for(n=0;n<19;n++)
{
Write1USART(n);
Write1USART(arrayrd[n]);
Delay10KTCYx(1);
Write1USART(iic_value1);
Delay10KTCYx(1);
Write1USART(iic_value2);
Delay10KTCYx(100);
}
Delay10KTCYx(10000);
}
while(1);
}
void I2C1_Init( void )
{
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
// Slew rate control enable for high speed mode(400kHz)
SSP1CON1=0x28; //SSPEN=1 and SSPM3:SSPM0=1000
SSP1ADD= 0x4f; //8Mhz cystall, 100khz
Delay100TCYx(10);
}
void I2C1_Start( void )
{
unsigned int i;
SSP1CON2bits.SEN = 1; // initiate bus start condition
iic_value1 = SSP1CON2;
iic_value2 = PIR1;
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if ( PIR1bits.SSP1IF )
break;
}
PIR1bits.SSP1IF = 0;
}
void I2C1_Stop( void )
{
unsigned int i;
SSP1CON2bits.PEN = 1;
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if (PIR1bits.SSP1IF)
break;
}
PIR1bits.SSP1IF = 0;
}
unsigned char I2C1_ReadAck( void )
{
unsigned int i;
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if (!SSP1CON2bits.ACKSTAT) {
return 1;
}
}
return 0;
}
void I2C1_SendByte( unsigned char u8_data )
{
unsigned int i;
SSP1BUF = u8_data;
// I2C2_ReadAck();
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if (PIR1bits.SSP1IF) {
break;
}
}
PIR1bits.SSP1IF = 0;
I2C1_ReadAck();
PIR1bits.SSP1IF = 0;
}
unsigned char I2C1_GetByte( void )
{
unsigned int i;
SSP1CON2bits.RCEN = 1;
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if ( SSP1STATbits.BF ) {
break;
}
}
PIR1bits.SSP1IF = 0;
return SSP1BUF;
}
void I2C1_SendACK( void )
{
unsigned int i;
SSP1CON2bits.ACKEN = 1;
for ( i=I2C_TIMEOUT; i; i-- ) { // this is about 1ms timeout
if ( SSP1CON2bits.ACKEN == 0 ) {
break;
}
}
PIR1bits.SSP1IF = 0;
}
void I2C1_SendNotACK( void )
{
SSP1CON2bits.ACKDT = 1;
I2C1_SendACK();
}
void Restart_I2C1( void )
{
SSP1CON2bits.RSEN = 1; // initiate bus restart condition
while(!PIR1bits.SSP1IF); // Completed the action when the SSPIF is Hi.
PIR1bits.SSP1IF=0;
} |