1.用STM32的芯片做主机,PIC16F677作为从机作数据采集。主机用模拟方式实现IIC通信,速率是400K,从机是通过配置相关的IIC寄存器实现。
2.上电后用示波器观察,主机有发送配置地址0XF0和10连续的共10个位的数据。
3.发送的地址和677的SSPADD配置地址0XF0是匹配的,但是没有数据由677发送过来。
疑问:
1.主机发送地址子节后的10两个位数据是否是从机的问应答信号。
2.因为我们的PIC仿真器好像不支持在线调试,从主机发完地址后没接收到从机的ASK,而从机的ASK是由硬件自动完成的,所以现在基本可以判定677是未进入中断,不知道这种看法是否正确。
3.677的配置和程序方面还有哪些欠缺和不足。
已经调试了好几天,但从机就是不发信号出来,请大家帮我看一下,到底问题在哪里?万分感谢
以下是PIC的I2C初始化配置和ISR:
void init_I2C( void )
{
INTCON |=0xc0; //enable GIE,PEIE
PIE1 |=0x08; //enable SSPIE 外设同步串行口中断使能位
SSPSTAT &=0x3F; //0011 1111:
// SSPSTAT &=0x00;
SSPCON = 0x36; //00110110: Enable SSPEN, Enable SCL, I2C 从模式,7Bits地址
//SSPCON = 0x3E;
SSPADD = 0xF0; //最高位8位为读写标志位R/W,1为读,即向STM32主机发送数据
SSPMSK=0xFE; //bit0 不起作用
CLR_I2C_BF; //read to clear BF flag.
// clear pending interrupts and enable I2C interrupts
CLR_SSPIF;
}
void interrupt SlaveI2CHandler(void)
{
if ((RW == 0)&&(DA==0))//寻址后,并由移位寄存器SSPSR和地址寄存器SSPADD自动比较是否匹配,
//如果匹配RW由硬件自动完成置0;
{ // write data to PIC MCU, ignore it and perform a dummy read
CLR_I2C_BF;
HOLD_SCL;
// delay_100us();
CLR_SSPOV;
CLR_SSPIF;
}
else if ((RW == 0)&&(DA==1))
{
RLS_SCL;
CLR_SSPIF;
}
else if((RW == 1)&&(DA==0)) //接收和发送的最后一个字节是地址,则向STM32发送数据
{ // READ data from MCU and address match 0
CLR_I2C_BF;
SSPBUF=LongLength; //LongLength
RLS_SCL;
// SSPSR=LongLength;//SSPSR不可直接访问,只能通过SSPBUF
while(BF==1);;//加入延时直到一个字节接收完毕才清中断
CLR_SSPIF;
CLR_SSPOV;
}
下面是STM32的主机程序:
STM32主程序通过 Read_A_Byte函数来调用IIC接口数据传输
Read_A_Byte(0XF0,(u8 *)IIC_Read_Temp);
u8 Read_A_Byte(unsigned char ChipAddr,unsigned char *Data) //read a byte from EEPROM (unsigned char ChipAddr,unsigned char addr,unsigned char *Data) //rea
{
unsigned char Data_Temp=0;
unsigned char Chip;
Chip=ChipAddr;
// Chip&=0xF1;
IIC_Start();
Write_Byte(Chip);
if(!IIC_Check_Ack()){IIC_Stop();return 0;} //read error
Data_Temp=Read_Byte_1();
NoAck();
IIC_Stop();
*Data=Data_Temp;
return 1; //Read correct return true
}
此帖出自
小平头技术问答
一周热门 更多>