STC8F2K16S2具有硬件IIC,根据芯片手册,将IIC的SCL和SDA脚切换到P32和P33,只需要将寄存器P_SW2赋值0xb0即可。但是在测试中,使用官方程序(查询方式)将P_SW2赋值0x80(IIC引脚切换到P14P15),可以读写,当然,读出数据只是0xFF而已。而将寄存器P_SW2赋值0xb0(切换到P32P33),程序便无法正常运行,好像是被停留在WAIT状态似的。 官方程序如下: sfr P_SW2 = 0xba;//硬件IIC引脚切换寄存器 #define I2CCFG (*(unsigned char volatile xdata *)0xfe80) #define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) #define I2CMSST (*(unsigned char volatile xdata *)0xfe82) #define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) #define I2CSLST (*(unsigned char volatile xdata *)0xfe84) #define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) #define I2CTXD (*(unsigned char volatile xdata *)0xfe86) #define I2CRXD (*(unsigned char volatile xdata *)0xfe87) void Wait() { while (!(I2CMSST &0x40)); I2CMSST &= ~0x40; } void Start() { I2CMSCR = 0x01; //发送START命令 Wait(); } void SendData(char dat) { I2CTXD = dat; //写数据到数据缓冲区 I2CMSCR = 0x02; //发送SEND命令 Wait(); } void RecvACK() { I2CMSCR = 0x03; //发送读ACK命令 Wait(); } char RecvData() { I2CMSCR = 0x04; //发送RECV命令 Wait(); return I2CRXD; } void SendACK() { I2CMSST = 0x00; //设置ACK信号 I2CMSCR = 0x05; //发送ACK命令 Wait(); } void SendNAK() { I2CMSST = 0x01; //设置NAK信号 I2CMSCR = 0x05; //发送ACK命令 Wait(); } void Stop() { I2CMSCR = 0x06; //发送STOP命令 Wait(); } void Delay() { int i; for (i=0; i<3000; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } void IIC_test() { P_SW2 = 0xb0; I2CCFG = 0xe0; //使能I2C主机模式 I2CMSST = 0x00; Start(); //发送起始命令 SendData(0xa0); //发送设备地址+写命令 RecvACK(); SendData(0x00); //发送存储地址高字节 RecvACK(); SendData(0x00); //发送存储地址低字节 RecvACK(); SendData(0x12); //写测试数据1 RecvACK(); SendData(0x78); //写测试数据2 RecvACK(); Stop(); //发送停止命令 Delay(); //等待设备写数据 Start(); //发送起始命令 SendData(0xa0); //发送设备地址+写命令 RecvACK(); SendData(0x00); //发送存储地址高字节 RecvACK(); SendData(0x00); //发送存储地址低字节 RecvACK(); Start(); //发送起始命令 SendData(0xa1); //发送设备地址+读命令 RecvACK(); P0 = RecvData(); //读取数据1 SendACK(); P2 = RecvData(); //读取数据2 SendNAK(); Stop(); //发送停止命令 P_SW2 = 0x00; }
|