|
20资产
编写了一段驱动nrf24le1内部的iic模块的程序,功能是作为master,其先给2线上的slave器件写2字节的数据,然后再从同一个slave器件上读4字节数据。该段程序能实现功能,但是不稳定,有时能够通信成功,有时通信到一半的时候,芯片死机了(中断程序也不能运行)。通过示波器观察,发现,原因是数据发送过程中,SCL信号自动被拉低(有时一字节数据没发送完,SCL信号就被拉低了),熟悉nrf24le1的高手请帮帮忙!写iic程序的函数如下:void write_cmd(unsigned char addr,unsigned char cmd,unsigned char dat1,unsigned char dat2){ unsigned char deviceaddr=addr; START(); W2DAT=(addr<<1)+0; // write iic device WaitWire2Free(); W2DAT=cmd; WaitWire2Free(); W2DAT=dat1; WaitWire2Free(); W2DAT=dat2; WaitWire2Free(); STOP(); iic_ibuf[7]=1;}读iic程序的函数如下:void read_to_iic_obuf(unsigned char addr,unsigned char n){ unsigned char i,byte_ctr; byte_ctr=n; clear_iic_obuf(); //清空缓冲区 START(); W2DAT=(addr<<1)+1; //read from 1200 slave// WaitWire2Free(); // wait ACK while(ACK); WaitWire2Free(); iic_obuf[0]=W2DAT; iic_obuf[0]=0; for(i=0;i<byte_ctr-1;i++) {WaitWire2Free();iic_obuf=W2DAT;} WaitWire2Free(); STOP(); iic_obuf[byte_ctr-1]=W2DAT; WaitWire2Free(); iic_ibuf[7]=1;}/************************************************** ************************************************功能:2线完成中断程序**************************************************/void wire2ISR() interrupt INTERRUPT_SERIAL{ c_flag=1;}/************************************************** ************************************************功能:等待2线数据传输完成**************************************************/void WaitWire2Free(void){ while(c_flag==0); // 等待传输标准位置1 c_flag=0; // 清除标志位}
|
|