0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MAX14900E八通道高速工业开关的CRC编程

星星科技指导员 来源:ADI 作者:ADI 2023-02-21 16:37 次阅读

MAX14900E为高性能、8通道工业开关,具有丰富、先进的特性集。SPI接口允许微控制器监视和控制MAX14900E的大部分方面。为了增强鲁棒性,MAX14900E中的硬件CRC(循环冗余校验)电路可以选择保护其与微处理器之间的所有数据,防止误码。

然而,在MAX14900E中启用CRC功能是不够的。微处理器还必须在软件中实现相同的CRC算法,既要为发送到MAX14900E的数据附加校验位,又要验证从MAX<>E接收的数据。实现此目的的一种方法是检查数据手册,并使用它来创建自定义固件以实现必要的CRC功能。

更好的方法是改用本应用笔记中的功能。这些是用C语言编写的,应该很容易移植到大多数常见的微处理器上。

选择正确的来源

本应用笔记提供了六组C源代码,每组都实现一个CRC生成器和一个CRC检查器。MAX14900E使用单字节或双字节包与微处理器通信。其中三个代码集实现单字节数据包的生成器和检查器算法,而其他三个代码集实现双字节数据包的生成器和检查器算法。

除了选择单字节或双字节数据包与MAX14900E通信外,另一个选择标准是代码大小与执行速度的重要性。本应用笔记提供了三种不同假设的源代码。首先,小代码大小是最重要的(执行速度是次要的)。其次,执行速度比代码大小更重要。第三,在代码大小和执行速度之间取得平衡。奇怪的是,在某些微处理器架构中,第三个“折衷”选项与第二个选项一样快,其中表查找相对昂贵。

使用的 API 约定

每个代码集定义两个函数调用,一个用于 CRC 生成器,另一个用于 CRC 检查器。请注意,在这些代码示例中,“无符号字符”是 8 位无符号值的别名,有时以不同的方式标记,例如 UINT8。函数返回值为“无符号字符”或“布尔值”,但如果返回值为“int”,而不是该微处理器的本机存储大小,则某些微处理器执行代码的速度更快。

单字节生成器函数调用如下所示:

send2 = generator (send1);

Send1是发送到MAX14900E的字节。代码应先发送1,后再发送2至MAX14900E。同样,双字节生成器函数调用如下所示:

send3 = generator(send1, send2);

用户应通过SPI接口发送3个字节,先发送1,后跟send2,然后发送3。

微处理器通过SPI接口将配置设置发送到MAX14900E,MAX14900E同时将状态信息返回给微处理器。单字节检查器如下所示:

flag = checker (ret1, ret2);

如果返回字节和 CRC 匹配,则布尔“标志”为真 (!= 0)。双字节检查器如下所示:

flag = checker (ret1, ret2, ret3);

小代码大小

本节中的代码示例使用循环来构建 CRC,一次生成一位。出于这个原因,它们不是那么快,而是紧凑地编译。这些代码片段依赖于帮助程序例程(Loop_CRC)来执行实际的一次位 CRC 计算。

unsigned char Loop_CRC (unsigned char crc, unsigned char byte)
{
	int i;

	for (i = 0; i < 8; i++)
	{
		crc <<= 1;
		if (crc & 0x80)
			crc ^= 0xB7; // 0x37 with MSBit on purpose
		if (byte & 0x80)
			crc ^=1;
		byte <<= 1;
	}

	return crc;
}

//
unsigned char crcSmallEncode8 (unsigned char byte1)
{
	unsigned char synd;

	synd = Loop_CRC (0x7f, byte1);
	return Loop_CRC (synd, 0x80) | 0x80;
}

//
bool crcSmallCheck8 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;

	synd = Loop_CRC (0x7f, byte1);
	return Loop_CRC (synd, byte2) == 0;
}

 

unsigned char Loop_CRC (unsigned char crc, unsigned char byte)
{
	int i;

	for (i = 0; i < 8; i++)
	{
		crc <<= 1;
		if (crc & 0x80)
			crc ^= 0xB7; // 0x37 with MSBit on purpose
		if (byte & 0x80)
			crc ^=1;
		byte <<= 1;
	}

	return crc;
}

//
unsigned char crcSmallEncode16 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;

	synd = Loop_CRC (0x7f, byte1);
	synd = Loop_CRC (synd, byte2);
	return Loop_CRC (synd, 0x80) | 0x80;
}

//
bool crcSmallCheck16 (unsigned char byte1, unsigned char byte2, unsigned char byte3)
{
	unsigned char synd;

	synd = Loop_CRC (0x7f, byte1);
	synd = Loop_CRC (synd, byte2);
	return Loop_CRC (synd, byte3) == 0;
}

快速执行

本节中的代码示例以代码大小换取速度。两个 128 字节的表对每个表访问的一个完整字节的数据进行编码。注意,如果用户只想保护发送到MAX14900E的数据,并且使用单字节事务,则用户只需要第二个表。

//
const unsigned char propagate8_next0 [128] = {
 0x00, 0x6E, 0x6B, 0x05, 0x61, 0x0F, 0x0A, 0x64,
 0x75, 0x1B, 0x1E, 0x70, 0x14, 0x7A, 0x7F, 0x11,
 0x5D, 0x33, 0x36, 0x58, 0x3C, 0x52, 0x57, 0x39,
 0x28, 0x46, 0x43, 0x2D, 0x49, 0x27, 0x22, 0x4C,
 0x0D, 0x63, 0x66, 0x08, 0x6C, 0x02, 0x07, 0x69,
 0x78, 0x16, 0x13, 0x7D, 0x19, 0x77, 0x72, 0x1C,
 0x50, 0x3E, 0x3B, 0x55, 0x31, 0x5F, 0x5A, 0x34,
 0x25, 0x4B, 0x4E, 0x20, 0x44, 0x2A, 0x2F, 0x41,
 0x1A, 0x74, 0x71, 0x1F, 0x7B, 0x15, 0x10, 0x7E,
 0x6F, 0x01, 0x04, 0x6A, 0x0E, 0x60, 0x65, 0x0B,
 0x47, 0x29, 0x2C, 0x42, 0x26, 0x48, 0x4D, 0x23,
 0x32, 0x5C, 0x59, 0x37, 0x53, 0x3D, 0x38, 0x56,
 0x17, 0x79, 0x7C, 0x12, 0x76, 0x18, 0x1D, 0x73,
 0x62, 0x0C, 0x09, 0x67, 0x03, 0x6D, 0x68, 0x06,
 0x4A, 0x24, 0x21, 0x4F, 0x2B, 0x45, 0x40, 0x2E,
 0x3F, 0x51, 0x54, 0x3A, 0x5E, 0x30, 0x35, 0x5B
};

const unsigned char propagate8_next1 [128] = {
 0xB7, 0xD9, 0xDC, 0xB2, 0xD6, 0xB8, 0xBD, 0xD3,
 0xC2, 0xAC, 0xA9, 0xC7, 0xA3, 0xCD, 0xC8, 0xA6,
 0xEA, 0x84, 0x81, 0xEF, 0x8B, 0xE5, 0xE0, 0x8E,
 0x9F, 0xF1, 0xF4, 0x9A, 0xFE, 0x90, 0x95, 0xFB,
 0xBA, 0xD4, 0xD1, 0xBF, 0xDB, 0xB5, 0xB0, 0xDE,
 0xCF, 0xA1, 0xA4, 0xCA, 0xAE, 0xC0, 0xC5, 0xAB,
 0xE7, 0x89, 0x8C, 0xE2, 0x86, 0xE8, 0xED, 0x83,
 0x92, 0xFC, 0xF9, 0x97, 0xF3, 0x9D, 0x98, 0xF6,
 0xAD, 0xC3, 0xC6, 0xA8, 0xCC, 0xA2, 0xA7, 0xC9,
 0xD8, 0xB6, 0xB3, 0xDD, 0xB9, 0xD7, 0xD2, 0xBC,
 0xF0, 0x9E, 0x9B, 0xF5, 0x91, 0xFF, 0xFA, 0x94,
 0x85, 0xEB, 0xEE, 0x80, 0xE4, 0x8A, 0x8F, 0xE1,
 0xA0, 0xCE, 0xCB, 0xA5, 0xC1, 0xAF, 0xAA, 0xC4,
 0xD5, 0xBB, 0xBE, 0xD0, 0xB4, 0xDA, 0xDF, 0xB1,
 0xFD, 0x93, 0x96, 0xF8, 0x9C, 0xF2, 0xF7, 0x99,
 0x88, 0xE6, 0xE3, 0x8D, 0xE9, 0x87, 0x82, 0xEC
};

//
unsigned char crcFastEncode8 (unsigned char byte1)
{
	unsigned char synd;
	
	synd = (byte1 & 0x80) ? 0xEC : 0x5B; // 6C & 5B before optimization
	synd ^= byte1;
	return propagate8_next1[synd];
}

bool crcFastCheck8 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;
	unsigned char const *ptr;

	synd = (byte1 & 0x80) ? 0xEC : 0x5B;
	synd ^= byte1;
	ptr = byte2 & 0x80 ? propagate8_next1 : propagate8_next0;
	return (ptr[synd] ^ byte2) == 0;
}
 
//
const unsigned char propagate8_next0 [128] = {
 0x00, 0x6E, 0x6B, 0x05, 0x61, 0x0F, 0x0A, 0x64,
 0x75, 0x1B, 0x1E, 0x70, 0x14, 0x7A, 0x7F, 0x11,
 0x5D, 0x33, 0x36, 0x58, 0x3C, 0x52, 0x57, 0x39,
 0x28, 0x46, 0x43, 0x2D, 0x49, 0x27, 0x22, 0x4C,
 0x0D, 0x63, 0x66, 0x08, 0x6C, 0x02, 0x07, 0x69,
 0x78, 0x16, 0x13, 0x7D, 0x19, 0x77, 0x72, 0x1C,
 0x50, 0x3E, 0x3B, 0x55, 0x31, 0x5F, 0x5A, 0x34,
 0x25, 0x4B, 0x4E, 0x20, 0x44, 0x2A, 0x2F, 0x41,
 0x1A, 0x74, 0x71, 0x1F, 0x7B, 0x15, 0x10, 0x7E,
 0x6F, 0x01, 0x04, 0x6A, 0x0E, 0x60, 0x65, 0x0B,
 0x47, 0x29, 0x2C, 0x42, 0x26, 0x48, 0x4D, 0x23,
 0x32, 0x5C, 0x59, 0x37, 0x53, 0x3D, 0x38, 0x56,
 0x17, 0x79, 0x7C, 0x12, 0x76, 0x18, 0x1D, 0x73,
 0x62, 0x0C, 0x09, 0x67, 0x03, 0x6D, 0x68, 0x06,
 0x4A, 0x24, 0x21, 0x4F, 0x2B, 0x45, 0x40, 0x2E,
 0x3F, 0x51, 0x54, 0x3A, 0x5E, 0x30, 0x35, 0x5B
};

const unsigned char propagate8_next1 [128] = {
 0xB7, 0xD9, 0xDC, 0xB2, 0xD6, 0xB8, 0xBD, 0xD3,
 0xC2, 0xAC, 0xA9, 0xC7, 0xA3, 0xCD, 0xC8, 0xA6,
 0xEA, 0x84, 0x81, 0xEF, 0x8B, 0xE5, 0xE0, 0x8E,
 0x9F, 0xF1, 0xF4, 0x9A, 0xFE, 0x90, 0x95, 0xFB,
 0xBA, 0xD4, 0xD1, 0xBF, 0xDB, 0xB5, 0xB0, 0xDE,
 0xCF, 0xA1, 0xA4, 0xCA, 0xAE, 0xC0, 0xC5, 0xAB,
 0xE7, 0x89, 0x8C, 0xE2, 0x86, 0xE8, 0xED, 0x83,
 0x92, 0xFC, 0xF9, 0x97, 0xF3, 0x9D, 0x98, 0xF6,
 0xAD, 0xC3, 0xC6, 0xA8, 0xCC, 0xA2, 0xA7, 0xC9,
 0xD8, 0xB6, 0xB3, 0xDD, 0xB9, 0xD7, 0xD2, 0xBC,
 0xF0, 0x9E, 0x9B, 0xF5, 0x91, 0xFF, 0xFA, 0x94,
 0x85, 0xEB, 0xEE, 0x80, 0xE4, 0x8A, 0x8F, 0xE1,
 0xA0, 0xCE, 0xCB, 0xA5, 0xC1, 0xAF, 0xAA, 0xC4,
 0xD5, 0xBB, 0xBE, 0xD0, 0xB4, 0xDA, 0xDF, 0xB1,
 0xFD, 0x93, 0x96, 0xF8, 0x9C, 0xF2, 0xF7, 0x99,
 0x88, 0xE6, 0xE3, 0x8D, 0xE9, 0x87, 0x82, 0xEC
};

//
// This is the fast (one byte at a time) algorithm
// 
// This is so fast that one could benefit from running it in-line
//
unsigned char crcFastEncode16 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;
	unsigned char const *ptr;

	synd = (byte1 & 0x80) ? 0xEC : 0x5B;
	synd ^= byte1;
	ptr = byte2 & 0x80 ? propagate8_next1 : propagate8_next0;
	synd = ptr[synd] ^ byte2;
	return propagate8_next1[synd];
}


bool crcFastCheck16 (unsigned char byte1, unsigned char byte2, unsigned char byte3)
{
	unsigned char synd;
	unsigned char const *ptr;

	synd = (byte1 & 0x80) ? 0xEC : 0x5B;
	synd ^= byte1;
	ptr = byte2 & 0x80 ? propagate8_next1 : propagate8_next0;
	synd = ptr[synd] ^ byte2;
	ptr = byte3 & 0x80 ? propagate8_next1 : propagate8_next0;
	return (ptr[synd] ^ byte3) == 0;
}

平衡

本节中的代码示例在代码大小和执行速度之间取得了平衡。一个表查找将 7 位数据编码到 CRC 中。第八位使用大小优化代码中使用的技术进行编码。一些哈佛架构设备具有相对昂贵的表查找执行时间,对于这类微处理器,这种平衡代码的执行速度可能与速度优化的代码一样快,甚至可能更快。

//
unsigned char propagate7 [128] = {
 0x00, 0x6E, 0xDC, 0xB2, 0xD6, 0xB8, 0x0A, 0x64,
 0xC2, 0xAC, 0x1E, 0x70, 0x14, 0x7A, 0xC8, 0xA6,
 0xEA, 0x84, 0x36, 0x58, 0x3C, 0x52, 0xE0, 0x8E,
 0x28, 0x46, 0xF4, 0x9A, 0xFE, 0x90, 0x22, 0x4C,
 0xBA, 0xD4, 0x66, 0x08, 0x6C, 0x02, 0xB0, 0xDE,
 0x78, 0x16, 0xA4, 0xCA, 0xAE, 0xC0, 0x72, 0x1C,
 0x50, 0x3E, 0x8C, 0xE2, 0x86, 0xE8, 0x5A, 0x34,
 0x92, 0xFC, 0x4E, 0x20, 0x44, 0x2A, 0x98, 0xF6,
 0x1A, 0x74, 0xC6, 0xA8, 0xCC, 0xA2, 0x10, 0x7E,
 0xD8, 0xB6, 0x04, 0x6A, 0x0E, 0x60, 0xD2, 0xBC,
 0xF0, 0x9E, 0x2C, 0x42, 0x26, 0x48, 0xFA, 0x94,
 0x32, 0x5C, 0xEE, 0x80, 0xE4, 0x8A, 0x38, 0x56,
 0xA0, 0xCE, 0x7C, 0x12, 0x76, 0x18, 0xAA, 0xC4,
 0x62, 0x0C, 0xBE, 0xD0, 0xB4, 0xDA, 0x68, 0x06,
 0x4A, 0x24, 0x96, 0xF8, 0x9C, 0xF2, 0x40, 0x2E,
 0x88, 0xE6, 0x54, 0x3A, 0x5E, 0x30, 0x82, 0xEC
};

//}
unsigned char crcMediumEncode8 (unsigned char byte1)
{
	unsigned char synd;

	synd = (byte1 ^ 0xEC);
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ 0x80;
	if (synd & 0x80)
		synd ^= 0xB7;
	return synd | 0x80;
}

//
bool crcMediumCheck8 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;

	synd = (byte1 ^ 0xEC);
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ byte2;
	if (synd & 0x80)
		synd ^= 0xB7;
	return synd == 0;
}

//
unsigned char propagate7 [128] = {
 0x00, 0x6E, 0xDC, 0xB2, 0xD6, 0xB8, 0x0A, 0x64,
 0xC2, 0xAC, 0x1E, 0x70, 0x14, 0x7A, 0xC8, 0xA6,
 0xEA, 0x84, 0x36, 0x58, 0x3C, 0x52, 0xE0, 0x8E,
 0x28, 0x46, 0xF4, 0x9A, 0xFE, 0x90, 0x22, 0x4C,
 0xBA, 0xD4, 0x66, 0x08, 0x6C, 0x02, 0xB0, 0xDE,
 0x78, 0x16, 0xA4, 0xCA, 0xAE, 0xC0, 0x72, 0x1C,
 0x50, 0x3E, 0x8C, 0xE2, 0x86, 0xE8, 0x5A, 0x34,
 0x92, 0xFC, 0x4E, 0x20, 0x44, 0x2A, 0x98, 0xF6,
 0x1A, 0x74, 0xC6, 0xA8, 0xCC, 0xA2, 0x10, 0x7E,
 0xD8, 0xB6, 0x04, 0x6A, 0x0E, 0x60, 0xD2, 0xBC,
 0xF0, 0x9E, 0x2C, 0x42, 0x26, 0x48, 0xFA, 0x94,
 0x32, 0x5C, 0xEE, 0x80, 0xE4, 0x8A, 0x38, 0x56,
 0xA0, 0xCE, 0x7C, 0x12, 0x76, 0x18, 0xAA, 0xC4,
 0x62, 0x0C, 0xBE, 0xD0, 0xB4, 0xDA, 0x68, 0x06,
 0x4A, 0x24, 0x96, 0xF8, 0x9C, 0xF2, 0x40, 0x2E,
 0x88, 0xE6, 0x54, 0x3A, 0x5E, 0x30, 0x82, 0xEC
};

//
unsigned char crcMediumEncode16 (unsigned char byte1, unsigned char byte2)
{
	unsigned char synd;

	synd = (byte1 ^ 0xEC);
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ byte2;
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ 0x80;
	if (synd & 0x80)
		synd ^= 0xB7;
	return synd | 0x80;
}

//
bool crcMediumCheck16 (unsigned char byte1, unsigned char byte2, unsigned char byte3)
{
	unsigned char synd;

	synd = (byte1 ^ 0xEC);
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ byte2;
	if (synd & 0x80)
		synd ^= 0xB7;
	synd = propagate7[synd] ^ byte3;
	if (synd & 0x80)
		synd ^= 0xB7;
	return synd == 0;
}

比较

为了了解这些CRC计算的效率,该代码是在以24 MIPS(16MHz内部CPU时钟)运行的Microchip PIC32F系列上实现的。这是一个具有 16 位指令的 24 位数据路径微处理器。对代码的唯一修改是将返回值更改为“short”,C 编译器将其解释为有符号的 16 位值,即其本机数据宽度。

代码大小由编译器和链接器表确定。辅助程序生成 1,024 个随机 8 位、16 位或 24 位值。报告的时间是这 1,024 次测试的平均值。表1总结了使用Microchip C编译器及其代码仿真器获得的数据。对于使用表查找的代码,大小以字节为单位指定为 CONST。

算法 字节(PGM + CONST) 编码时间(μs) 解码时间(微秒)
紧凑的单字节 219 24.8 25.5
快速单字节 570 (186 + 384) 1.72 3.00
平衡单字节 323 (195 + 128) 2.06 2.44
紧凑双字节 267 37.2 37.8
快速双字节 723 (339 + 384) 3.19 4.34
平衡双字节 473 (345 + 128) 3.02 3.40

不同的微处理器会产生不同的结果,但在PIC24F的情况下,不需要使用快速算法。如果对快速CRC转换感兴趣,则应在目标处理器上对快速算法和平衡算法进行基准测试,以确定哪个更好。

结论

本应用笔记介绍了如何在与MAX14900E八通道高速工业开关通信的微处理器上对CRC算法进行编码。利用本应用笔记中的C代码示例是实现这种额外保护的无忧方法。

在某些情况下,应在目标处理器上执行一些基准测试,尤其是在优先考虑快速执行速度的情况下。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147651
  • crc
    crc
    +关注

    关注

    0

    文章

    191

    浏览量

    29195
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89620
收藏 人收藏

    评论

    相关推荐

    78M6618 八通道功率和电能测量芯片

    78M6618 八通道功率和电能测量芯片78M6618是高度集成的单相、路电源出口、PDU功率测量和监控SoC,器件包括32位计算引擎(CE)、MPU内核、RTC和闪存。Teridian通过一次
    发表于 12-23 20:17

    CD4051八通道模拟开关的地址线ABC该怎么接?

    CD4051八通道模拟开关的地址线ABC该怎么接?一般接到哪里?由什么来控制他们?学渣求大神指点!
    发表于 04-21 08:36

    IPCS-R8 八通道电源控制器

    各位大神,求IPCS-R8 八通道电源控制器程序,谢谢!
    发表于 01-06 11:07

    USB八通道示波器

    ,一般使用示波器的外触发输入功能和参考同步信号测量多路信号。市面上现能提供8通道独立示波器的只有日本横河(型号为DLM4038和DLM4038),但价格昂贵;而USB八通道示波器是低成本实现8路同步
    发表于 08-02 10:54

    请问谁有八通道模数转换器ADS1178的前级数据采样电路?

    谁有八通道模数转换器ADS1178的前级数据采样电路(主要是对电网电压的采样),谢谢
    发表于 06-06 09:49

    八通道电容式触摸按键芯片TW308

    标准SOP24 封装1.2 应用场合? 家电? 代替薄膜开关、机械开关? 密封式控制面板,键盘? 应用在门钥匙锁矩阵类型上? 替代触摸屏TW308资料见附件参考图TW308八通道触摸IC_V4.2.pdf (910.41 KB
    发表于 07-05 04:00

    八通道10位并行加载数模转换器AD7809

    AD7809八通道,10位并行加载DAC的典型应用。这些器件采用+ 3.3V至+ 5V(±10%)电源供电,并集成了片内基准电压源
    发表于 04-03 06:56

    八通道10位并行加载数模转换器AD7809

    AD7809八通道,10位并行加载DAC的典型应用。这些器件采用+ 3.3V至+ 5V(±10%)电源供电,并集成了片内基准电压源
    发表于 04-06 09:02

    八通道10位并行加载数模转换器AD7809

    AD7809八通道,10位并行加载DAC的典型应用。这些器件采用+ 3.3V至+ 5V(±10%)电源供电,并集成了片内基准电压源
    发表于 04-06 12:34

    数字输出驱动器:理解关键特性与挑战

    记6002:“MAX14900E八通道高速工业开关CRC
    发表于 11-18 09:31

    八通道高压发送器接收器开关MAX4937电子资料

    概述:MAX4937采用节省空间的5mm x 11mm、56引脚TQFN封装,为八通道、高压发送器/接收器(T/R)开关。T/R开关基于二极管桥拓扑,二极管桥的总电流可通过SPI™接口
    发表于 04-14 06:16

    八通道超声前端与CW多普勒混频器MAX2078电子资料

    概述:MAX2078是MAXIM公司生产的一款八通道超声前端是一个完全集成的双极性,高密度的八通道超声接收器的低成本,高信道计数,高性能便携式和推车式超声系统进行了优化。易于使用的集成电路,用户可以实现高端2D ,...
    发表于 04-21 06:16

    求一种八通道传输/接收(T/R)开关的设计方案

    求一种八通道传输/接收(T/R)开关的设计方案
    发表于 05-24 06:32

    MAX14900E 八路高速工业开关CRC 编程

    发表于 11-16 21:44 0次下载
    <b class='flag-5'>MAX14900E</b> 八路<b class='flag-5'>高速</b><b class='flag-5'>工业</b><b class='flag-5'>开关</b>的 <b class='flag-5'>CRC</b> <b class='flag-5'>编程</b>

    MAX14915八通道工业、高边开关CRC编程指南

    MAX14915为高性能、8通道工业高边开关,具有丰富、先进的功能集。SPI接口允许微控制器监视和控制MAX14915的大部分方面。
    的头像 发表于 02-21 16:14 706次阅读
    <b class='flag-5'>MAX</b>14915<b class='flag-5'>八通道</b>、<b class='flag-5'>工业</b>、高边<b class='flag-5'>开关</b><b class='flag-5'>CRC</b><b class='flag-5'>编程</b>指南