STC8F2K16S2具有硬件IIC,根據(jù)芯片手冊(cè),將IIC的SCL和SDA腳切換到P32和P33,只需要將寄存器P_SW2賦值0xb0即可。但是在測(cè)試中,使用官方程序(查詢(xún)方式)將P_SW2賦值0x80(IIC引腳切換到P14P15),可以讀寫(xiě),當(dāng)然,讀出數(shù)據(jù)只是0xFF而已。而將寄存器P_SW2賦值0xb0(切換到P32P33),程序便無(wú)法正常運(yùn)行,好像是被停留在WAIT狀態(tài)似的。 官方程序如下: 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; //發(fā)送START命令 Wait(); } void SendData(char dat) { I2CTXD = dat; //寫(xiě)數(shù)據(jù)到數(shù)據(jù)緩沖區(qū) I2CMSCR = 0x02; //發(fā)送SEND命令 Wait(); } void RecvACK() { I2CMSCR = 0x03; //發(fā)送讀ACK命令 Wait(); } char RecvData() { I2CMSCR = 0x04; //發(fā)送RECV命令 Wait(); return I2CRXD; } void SendACK() { I2CMSST = 0x00; //設(shè)置ACK信號(hào) I2CMSCR = 0x05; //發(fā)送ACK命令 Wait(); } void SendNAK() { I2CMSST = 0x01; //設(shè)置NAK信號(hào) I2CMSCR = 0x05; //發(fā)送ACK命令 Wait(); } void Stop() { I2CMSCR = 0x06; //發(fā)送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主機(jī)模式 I2CMSST = 0x00; Start(); //發(fā)送起始命令 SendData(0xa0); //發(fā)送設(shè)備地址+寫(xiě)命令 RecvACK(); SendData(0x00); //發(fā)送存儲(chǔ)地址高字節(jié) RecvACK(); SendData(0x00); //發(fā)送存儲(chǔ)地址低字節(jié) RecvACK(); SendData(0x12); //寫(xiě)測(cè)試數(shù)據(jù)1 RecvACK(); SendData(0x78); //寫(xiě)測(cè)試數(shù)據(jù)2 RecvACK(); Stop(); //發(fā)送停止命令 Delay(); //等待設(shè)備寫(xiě)數(shù)據(jù) Start(); //發(fā)送起始命令 SendData(0xa0); //發(fā)送設(shè)備地址+寫(xiě)命令 RecvACK(); SendData(0x00); //發(fā)送存儲(chǔ)地址高字節(jié) RecvACK(); SendData(0x00); //發(fā)送存儲(chǔ)地址低字節(jié) RecvACK(); Start(); //發(fā)送起始命令 SendData(0xa1); //發(fā)送設(shè)備地址+讀命令 RecvACK(); P0 = RecvData(); //讀取數(shù)據(jù)1 SendACK(); P2 = RecvData(); //讀取數(shù)據(jù)2 SendNAK(); Stop(); //發(fā)送停止命令 P_SW2 = 0x00; }
|