由于项目需要跟多个I2C从机通讯,从机地址相同又无法修改,只能将从机接到不同的IO
所以我写了如下代码来动态设置I2C引脚
#include <STC32G.H>
#define GPIO_PIN_SET_H 1
#define GPIO_PIN_SET_L 0
u8 I2C_SCL_PIN;
u8 I2C_SDA_PIN;
void Delay5us() //@22.1184MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 26UL;
while (i) i--;
}
void GPIO_WritePin(u8 Pin, bit value) //设置引脚值
{
switch(Pin)
{
case 1: P20 = value; break;
case 2: P21 = value; break;
case 3: P22 = value; break;
case 4: P23 = value; break;
case 5: P24 = value; break;
case 6: P25 = value; break;
case 7: P26 = value; break;
case 8: P27 = value; default: break;
}
}
bit GPIO_ReadPin(u8 Pin) //获取引脚值
{
bit value;
switch(Pin)
{
case 1: value = P20; break;
case 2: value = P21; break;
case 3: value = P22; break;
case 4: value = P23; break;
case 5: value = P24; break;
case 6: value = P25; break;
case 7: value = P26; break;
case 8: value = P27; default: break;
}
return value;
}
void SET_SCL_H(void)
{
GPIO_WritePin(I2C_SCL_PIN, GPIO_PIN_SET_H);
}
void SET_SCL_L(void)
{
GPIO_WritePin(I2C_SCL_PIN, GPIO_PIN_SET_L);
}
void SET_SDA_H(void)
{
GPIO_WritePin(I2C_SDA_PIN, GPIO_PIN_SET_H);
}
void SET_SDA_L(void)
{
GPIO_WritePin(I2C_SDA_PIN, GPIO_PIN_SET_L);
}
bit GET_SDA(void)
{
return GPIO_ReadPin(I2C_SDA_PIN);
}
void SET_I2C_Pin(u8 SCL_PIN, u8 SDA_PIN)
{
I2C_SCL_PIN = SCL_PIN;
I2C_SDA_PIN = SDA_PIN;
}
void main()
{
WTST = 0x00;
CKCON = 0x00;
EAXFR = 1;
P2M0 = 0x00;
P2M1 = 0x00;
SET_I2C_Pin(0,1); //设置SCL引脚为P20,SDA引脚为P21
while(1)
{
SET_SDA_H(); //通过函数给IO赋值
//P21 = 1; //直接给IO赋值
Delay5us();
SET_SDA_L();
//P21 = 0;
Delay5us();
}
}
实验结果
通过函数给IO赋值只有80KHZ
如果直接给IO赋值频率有97.6KHZ,差异太大,请大神帮忙看下代码有没有优化空间
|