添加部分常用API。 添加 newlife rpc 通讯。
JiuHuan 编写于 2024-08-16 10:56:23
microCLib

#include "HC165.h"

static void DelayUs(uint us)
{
	for (int i = 0; i < us; i++)
	{
		for (volatile int j = 0; j < 10; j++)
		{
		}
	}
}

/// <summary>初始化gpio</summary>
/// <param name="port"></param>
void HC165Init(HC165_t* port)
{
	GpioInit(port->Data, PIN_INPUT, PIN_OUTPUT_PP, PIN_NO_PULL, 0, 0);

	GpioInit(port->Ce, PIN_OUTPUT, PIN_OUTPUT_PP, PIN_NO_PULL, 0, 0);
	GpioInit(port->Cp, PIN_OUTPUT, PIN_OUTPUT_PP, PIN_NO_PULL, 0, 0);
	GpioInit(port->Pl, PIN_OUTPUT, PIN_OUTPUT_PP, PIN_NO_PULL, 0, 0);
}

/// <summary>采样数据到165芯片内部</summary>
/// <param name="port"></param>
void HC165Take(HC165_t* port)
{
	GpioWrite(port->Ce, true);

	GpioWrite(port->Pl, false);
	DelayUs(port->DelayUs);
	GpioWrite(port->Pl, true);

	GpioWrite(port->Ce, false);
}

/// <summary>读取数据</summary>
/// <param name="port"></param>
/// <param name="data"></param>
/// <param name="len"></param>
/// <param name="bitBigEndian">大端bit</param>
void HC165Read(HC165_t* port, byte* data, int len ,bool bitBigEndian)
{
	if (port == NULL)return;
	if (data == NULL)return;
	if (len < 1)return;

	for (int i = 0; i < len; i++)
	{
		byte dat = 0x00;
		for (int j = 0; j < 8; j++)
		{
			// 下降沿拿数据
			GpioWrite(port->Cp, false);
			DelayUs(port->DelayUs);

			if (GpioRead(port->Data))
			{
				byte mask = 0x01 << j;
				if (bitBigEndian) mask = 0x80 >> j;

				dat |= mask;
			}

			GpioWrite(port->Cp, true);
			// DelayUs(port->DelayUs);
		}

		data[i] = dat;
	}
}