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
}
此帖出自
小平头技术问答
1. 看看芯片的勘误表,Microchip芯片的bug不少;
2. 硬件配置字是不是正确,是否把I2C口又配置成别的功能了;
3. I2C设备Slave地址是不是正确的,这个好像要除2的,也就是说是不算R/W位的7位地址;
4. 拿示波器看看时序,
5. 如果你用的ICD2,那么还是可以设断点的,就是反应很慢。
6. 找个例子试试,Microchip公司的网站上应该有。
1.SSP的start bit,fail to regonize start bit
2.SSP的SSPIF Flag,SSPIF Set on first reception only.
这个不太清除具体有什么关联。
另外I2C的SPPCON都已经配置成从机,7位地址模式了,就算是吧地址字节改为7位的0x50也不行
,所以就没能发出应答和数据。网上一些例子都是关于用PIC当主机去读取EEPROM的,和这个不太接近。PDF的这部分也阅读了多次,就是感觉欠缺了谢什么,所以程序没进入中断,郁闷啊。。。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....
先不要使用400k的高速模式,另外你的主机程序可能也有问题。
为什么要模拟呢?
一周热门 更多>