简单易懂的XY2-100协议, 主控使用雅特力AT32F403A, 使用GPIO模拟协议发送. 频率约500Khz.
__IO uint16_t ZzXDat;
__IO uint16_t ZzYDat;
#define XY2_100_MASK (0x80000)
void TaskDriveXY2100(void)
{
uint32_t xDat_;
uint32_t yDat_;
uint32_t sync_ = 0xFFFFE;
uint8_t i, xCnt_ = 0, yCnt_ = 0;
//第一步赋值计算寄偶校验位
xDat_ = ZzXDat;
yDat_ = ZzYDat;
for (i = 0; i < 16; i++)
{
if (xDat_ & 0x01)
xCnt_++;
if (yDat_ & 0x01)
yCnt_++;
xDat_ >>= 1;
yDat_ >>= 1;
}
xCnt_ = (xCnt_ % 2);
yCnt_ = (yCnt_ % 2);
//第二步组装数据, 帧头固定'001'
xDat_ = ZzXDat;
yDat_ = ZzYDat;
xDat_ <<= 1;
yDat_ <<= 1;
xDat_ |= (0x01 << 17);
yDat_ |= (0x01 << 17);
xDat_ |= (xCnt_ & 0x01);
yDat_ |= (yCnt_ & 0x01);
//第三步发送数据
for (i = 0; i < 20; i++)
{
PESet(10);
PEOut(9) = ((sync_ & XY2_100_MASK) >> 19);
PEOut(11) = ((xDat_ & XY2_100_MASK) >> 19);
PEOut(12) = ((yDat_ & XY2_100_MASK) >> 19);
sys_nopLoop(22);
__NOP();
__NOP();
sync_ <<= 1;
xDat_ <<= 1;
yDat_ <<= 1;
PEReSet(10);
sys_nopLoop(24);
}
//第四步空闲期间拉低电平便于下次发送
PEReSet(9);
PEReSet(10);
PEReSet(11);
PEReSet(12);
}