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; }
|