当前位置:文档之家› STM32F10x_SPI与I2S

STM32F10x_SPI与I2S

STM32F10x_SPI与I2S
STM32F10x_SPI与I2S

SPI与I2S

库函数。

Table.0-2 库函数列表

串行外设接口(SPI)提供与外部设备进行同步串行通讯的功能。接口可以被设置工作在主模式或者从模式。

/*【01】函数SPI_I2S_DeInit

******************************************************************************

* Function Name : SPI_I2S_DeInit

* Description : Deinitializes the SPIx peripheral registers to their default

* reset values (Affects also the I2Ss).

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.

* Output : None

* Return : None

*******************************************************************************/

void SPI_I2S_DeInit(SPI_TypeDef* SPIx)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

switch (*(u32*)&SPIx)

{

case SPI1_BASE:

/* Enable SPI1 reset state */

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);

/* Release SPI1 from reset state */

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);

break;

case SPI2_BASE:

//I2S只有I2S2、I2S3,分别对应SPI2、SPI3。先开启SPI2外设,然后设置I2SCFGR可以开启I2S2或SPI2 /* Enable SPI2 reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);

/* Release SPI2 from reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);

break;

case SPI3_BASE:

/* Enable SPI3 reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);

/* Release SPI3 from reset state */

RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE);

break;

default:

break;

}

}

/*【02】函数SPI_Init

******************************************************************************

* Function Name : SPI_Init

* Description : Initializes the SPIx peripheral according to the specified

* parameters in the SPI_InitStruct.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.

* - SPI_InitStruct: pointer to a SPI_InitTypeDef structure that contains the

* configuration information for the specified SPI peripheral.

* Output : None

* Return : None

******************************************************************************/

SPI_InitTypeDef structure:

typedef struct

{

u16 SPI_Direction;

u16 SPI_Mode;

u16 SPI_DataSize;

u16 SPI_CPOL;

u16 SPI_CPHA;

u16 SPI_NSS;

u16 SPI_BaudRatePrescaler;

u16 SPI_FirstBit;

u16 SPI_CRCPolynomial;

}SPI_InitTypeDef;

SPI_Direction:设置了SPI单向或者双向的数据模式。

Table.02-1 SPI_Direction值

Table .02-2 SPI_Mode值

Table.02-3 SPI_DataSize值

Table.02-4 SPI_ SPI_CPOL 值

Table.02-5 SPI_SPI_CPHA值

SPI_NSS:指定了NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理。

Table .02-6 SPI_NSS值

SCK时钟。 Table.02-7 SPI_BaudRatePrescaler值

注意:通讯时钟由主SPI的时钟分频而得,不需要设置从SPI的时钟。

SPI_FirstBit:指定了数据传输从MSB位还是LSB 位开始。

SPI_CRCPolynomial:定义了用于CRC值计算的多项式:>= 0x1。

例:

/* Initialize the SPI1 according to the SPI_InitStructure members */

SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

SPI_InitStructure.SPI_DatSize = SPI_DatSize_16b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

函数原型如下:

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)

{

u16 tmpreg = 0;

/* check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

/* Check the SPI parameters */

assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction));

assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));

assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize));

assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));

assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));

assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS));

assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler));

assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit));

assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial));

/*---------------------------- SPIx CR1 Configuration ------------------------*/

/* Get the SPIx CR1 value */

tmpreg = SPIx->CR1;

/* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ tmpreg &= CR1_CLEAR_Mask;// 0x3040,CR1除了CRCEN、CRCNEXT、SPE三个控制位,其他都清除。

/* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler master/salve mode, CPOL and CPHA */

/* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */

/* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */

/* Set LSBFirst bit according to SPI_FirstBit value */

/* Set BR bits according to SPI_BaudRatePrescaler value */

/* Set CPOL bit according to SPI_CPOL value */

/* Set CPHA bit according to SPI_CPHA value */

tmpreg |= (u16)((u32)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode |

SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL |

SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |

SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); /* Write to SPIx CR1 */

SPIx->CR1 = tmpreg;

/* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */

SPIx->I2SCFGR &= SPI_Mode_Select; // 0xF7FF,bit11:I2SMOD( 0--SPI;1--I2S )

/*---------------------------- SPIx CRCPOLY Configuration --------------------*/

/* Write to SPIx CRCPOLY */

SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial;

}

/*【03】函数I2S_Init

******************************************************************************

* Function Name : I2S_Init

* Description : Initializes the SPIx peripheral according to the specified

* parameters in the I2S_InitStruct.

* Input : - SPIx: where x can be 2 or 3 to select the SPI peripheral

* (configured in I2S mode).

* - I2S_InitStruct: pointer to an I2S_InitTypeDef structure that

* contains the configuration information for the specified

* SPI peripheral configured in I2S mode.

* Output : None

* Return : None

******************************************************************************/

结构体I2S_InitTypeDef定义如下:

typedef struct

{

u16 I2S_Mode;

u16 I2S_Standard;

u16 I2S_DataFormat;

u16 I2S_MCLKOutput;

u16 I2S_AudioFreq;

u16 I2S_CPOL;

}I2S_InitTypeDef;

[1]、I2S_Mode:

[2] Table.03-2 I2S 标准选择值如下表

[3] Table.03-3通道数据长度

展16位”,数据16位放在32位包的MSB 处,后16位LSB 强制位0填充;对于“24位”、“32位”,放在MSB 除,LSB 也强制填充为0,发送时分2次发送。 [4]、I2S_MCLKOutput :主设备时钟输出使能 Table.03-4主设备时钟输出使能

[5]的值。 Table.03-5音频通道采样频率

下图是I2S 时钟发生器的结构图

线性分频器需要按照以下的公式来设置,以获得需要的频率:

1、当需要生成主时钟时(寄存器SPI->I2SPR 的MCKOE =‘1’) :

A 、声道的帧长为16位时,Fs = I2SxCLK / [(16*2) * ((2*I2SDIV) + ODD)*8]

B、声道的帧长为32位时,Fs = I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)*4]

即:在MCKOE=1时,不管声道帧长为16位或32或,固定Fs= I2SxCLK / [256 * ((2*I2SDIV) + ODD)]

2、当关闭主时钟时(MCKOE =‘0’) :

A、声道的帧长为16位时,Fs = I2SxCLK / [(16*2) * ((2*I2SDIV) + ODD)]

B、声道的帧长为32位时,Fs = I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)]

上述

1、I2SxCLK 的时钟源是系统时钟(即驱动AHB时钟的HSI、HSE或PLL )

2、第一个“2”表示左右声道;

3、“(2*I2SDIV) + ODD”表示I2SPR内bit8-0控制关系;

4、“16”或“32”表示帧长度,指的是I2SCFGR.CHLEN控制下的位宽;

5、“8”或“4”表示“I2S主时钟可以输出到外部音频设备,比率固定为256*Fs”模式下的256对齐系数。

6、Fs = 音频通道采样频率(参看I2S_AudioFreq取值);

7、I2SxCLK为I2Sx的外设时钟。

而:

I2S 的比特率即确定了在I2S 数据线上的数据流和I2S的时钟信号频率。

I2S比特率 = 每个声道的比特数×声道数目×音频采样频率

对于一个左右声道,16位音频,I2S比特率计算为:I2S 比特率 = 16 × 2 × Fs

如果包长为32位,则有:I2S 比特率 = 32 × 2 × Fs

[6]、I2S_CPOL:I2S静止态时钟极性:为高电平还是位低电平。

Table.03-6 空闲状态下,时钟的电平取值

在调用本函数之前,必须对上述结构体成员进行数据初始化设置。

函数原型如下:

void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct)

{

u16 tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1;

u32 tmp = 0;

RCC_ClocksTypeDef RCC_Clocks;

/* Check the I2S parameters */

assert_param(IS_SPI_23_PERIPH(SPIx));

assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode));

assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard));

assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat));

assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput));

assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq));

assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL));

/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/

/* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits *///全配置

SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; //0xF040

//Bit6、Bit12-15为保留位,不改变,保持为0;

//备注:凡Mask直接清0寄存器位,保留位对应的Mask值一律保持为1,以保证不改变原0值状态。

SPIx->I2SPR = 0x0002;

/* Get the I2SCFGR register value */

tmpreg = SPIx->I2SCFGR;

/* If the default value has to be written, reinitialize i2sdiv and i2sodd*/

if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default)//缺省频率为2Hz

{

i2sodd = (u16)0;//偶系数:Freq = i2sdiv*2。如果设置为1(奇系数),则Freq = i2sdiv*2+1

i2sdiv = (u16)2; //2分频值,结合上句,则实际时钟为2*2=4分频。

}

/* If the requested audio frequency is not the default, compute the prescaler */

else

{

/* Check the frame length (For the Prescaler computing) */

if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b)//通道位宽16位

{

/* Packet length is 16 bits */

packetlength = 1;//包长为1表示16位。此时,CHLEN = 0。

}

else//扩展16位?24位?32位?

{

/* Packet length is 32 bits */

packetlength = 2; //包长为2表示32位。此时,CHLEN = 1。包长这里起到控制程序作用。

}

/* Get System Clock frequency */

RCC_GetClocksFreq(&RCC_Clocks);//来源于SYSCLK(AHB)—HSI? PLLCLK? HSE?

/* Compute the Real divider depending on the MCLK output state with a flaoting point */

if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable)//MCKOE = 1

{

/* MCLK output is enabled */

tmp = (u16)(((10 * RCC_Clocks.SYSCLK_Frequency) / (256 * I2S_InitStruct->I2S_AudioFreq)) + 5); }// RCC_Clocks.SYSCLK_Frequency = HSI或HSE或PLLCLK = 8M、16M、24M、48M、72M。

else//MCKOE = 0

{

/* MCLK output is disabled */

tmp = (u16)(((10 * RCC_Clocks.SYSCLK_Frequency) / (32 * packetlength * \

I2S_InitStruct->I2S_AudioFreq)) + 5);// packetlength* AudioFreq = I2S 比特率。

}

/* Remove the flaoting point */

tmp = tmp/10;

//*10、 +5、/10,以保证tmp取值为四舍五入。

//仅在(MCKOE = 1)8M时钟 48K、44.1K、22.05K取值,

// 16M时钟 48K、44.1K取值下,tmp = 1,其他取值都能保证>=2。

/* Check the parity of the divider */

i2sodd = (u16)(tmp & (u16)0x0001);//获取分频系数的奇偶性(LSB)。

/* Compute the i2sdiv prescaler */

i2sdiv = (u16)((tmp - i2sodd) / 2);//去除奇偶性后的分频值,即去掉LSB。

/* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */

i2sodd = (u16) (i2sodd << 8);//把决定奇偶性的LSB位左移8位,用于控制I2SPR.ODD位。 }

/* Test if the divider is 1 or 0 */

if ((i2sdiv < 2) || (i2sdiv > 0xFF))

{

/* Set the default values */

i2sdiv = 2;

i2sodd = 0; //如果分频系数小于2或大于0xFF,都把分频系数设置为:Default、偶分频。 }

/* Write to SPIx I2SPR register the computed value */

SPIx->I2SPR = (u16)(i2sdiv | i2sodd | I2S_InitStruct->I2S_MCLKOutput);

/* Configure the I2S with the SPI_InitStruct values */

tmpreg |= (u16)(I2S_Mode_Select | I2S_InitStruct->I2S_Mode | \

I2S_InitStruct->I2S_Standard | I2S_InitStruct->I2S_DataFormat | \

I2S_InitStruct->I2S_CPOL);

/* Write to SPIx I2SCFGR */

SPIx->I2SCFGR = tmpreg;

}

被调用函数RCC_GetClocksFreq(&RCC_Clocks);如下

/*【04】函数SPI_StructInit

******************************************************************************

* Function Name : SPI_StructInit

* Description : Fills each SPI_InitStruct member with its default value.

* Input : - SPI_InitStruct : pointer to a SPI_InitTypeDef structure

* which will be initialized.

* Output : None

* Return : None

*******************************************************************************/

Table 420. 给出了SPI_InitStruct各个成员的缺省值

Table.04-1 SPI_InitStruct缺省值

结构体

typedef struct

{

u16 I2S_Mode;

u16 I2S_Standard;

u16 I2S_DataFormat;

u16 I2S_MCLKOutput;

u16 I2S_AudioFreq;

u16 I2S_CPOL;

}I2S_InitTypeDef;

例:

/* Initialize an SPI_InitTypeDef structure */

SPI_InitTypeDef SPI_InitStructure;

SPI_StructInit(&SPI_InitStructure);

函数原型如下:

void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct)

{

/*--------------- Reset SPI init structure parameters values -----------------*/ /* Initialize the SPI_Direction member */

SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex;

/* initialize the SPI_Mode member */

SPI_InitStruct->SPI_Mode = SPI_Mode_Slave;

/* initialize the SPI_DataSize member */

SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b;

/* Initialize the SPI_CPOL member */

SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low;

/* Initialize the SPI_CPHA member */

SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge;

/* Initialize the SPI_NSS member */

SPI_InitStruct->SPI_NSS = SPI_NSS_Hard;

/* Initialize the SPI_BaudRatePrescaler member */

SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

/* Initialize the SPI_FirstBit member */

SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB;

/* Initialize the SPI_CRCPolynomial member */

SPI_InitStruct->SPI_CRCPolynomial = 7;

}

/*【05】函数I2S_StructInit

****************************************************************************** * Function Name : I2S_StructInit

* Description : Fills each I2S_InitStruct member with its default value.

* Input : - I2S_InitStruct : pointer to a I2S_InitTypeDef structure

* which will be initialized.

* Output : None

* Return : None

*******************************************************************************/ void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct)

{

/*--------------- Reset I2S init structure parameters values -----------------*/ /* Initialize the I2S_Mode member */

I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx;

/* Initialize the I2S_Standard member */

I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips;

/* Initialize the I2S_DataFormat member */

I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b;

/* Initialize the I2S_MCLKOutput member */

I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable;

/* Initialize the I2S_AudioFreq member */

I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default;

/* Initialize the I2S_CPOL member */

I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low;

}

/*【06】函数SPI_Cmd

******************************************************************************

* Function Name : SPI_Cmd

* Description : Enables or disables the specified SPI peripheral.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * - NewState: new state of the SPIx peripheral.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/ void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected SPI peripheral */

SPIx->CR1 |= CR1_SPE_Set;// 0x0040,开启SPI设备

}

else

{

/* Disable the selected SPI peripheral */

SPIx->CR1 &= CR1_SPE_Reset;// 0xFFBF

}

}

/*【07】函数I2S_Cmd

******************************************************************************

* Function Name : I2S_Cmd

* Description : Enables or disables the specified SPI peripheral (in I2S mode).

* Input : - SPIx: where x can be 2 or 3 to select the SPI peripheral.

* - NewState: new state of the SPIx peripheral.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/

void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_SPI_23_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected SPI peripheral (in I2S mode) */

SPIx->I2SCFGR |= I2SCFGR_I2SE_Set;// 0x0400,开启I2S

}

else

{

/* Disable the selected SPI peripheral (in I2S mode) */

SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset;// 0xFBFF

}

}

/*【08】函数SPI_I2S_ITConfig

******************************************************************************

* Function Name : SPI_I2S_ITConfig

* Description : Enables or disables the specified SPI/I2S interrupts.

* Input : - SPIx: where x can be :

* - 1, 2 or 3 in SPI mode

* - 2 or 3 in I2S mode

* - SPI_I2S_IT: specifies the SPI/I2S interrupt source to be enabled or disabled. * This parameter can be one of the following values:

* - SPI_I2S_IT_TXE: Tx buffer empty interrupt mask

* - SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask

* - SPI_I2S_IT_ERR: Error interrupt mask

* - NewState: new state of the specified SPI/I2S interrupt.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/

SPI_IT:输入参数SPI_IT使能或者失能SPI的中断。可以取下表的一个或者多个取值的组合作为该参数的值。

例:

/* Enable SPI2 Tx buffer empty interrupt */

SPI_ITConfig(SPI2, SPI_IT_TXE, ENABLE);

函数原型如下:

void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, u8 SPI_I2S_IT, FunctionalState NewState)

{

u16 itpos = 0, itmask = 0 ;

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT));

/* Get the SPI/I2S IT index */

itpos = SPI_I2S_IT >> 4;//取出IT在CR2的位置

/* Set the IT mask */

itmask = (u16)((u16)1 << itpos);

if (NewState != DISABLE)

{

/* Enable the selected SPI/I2S interrupt */

SPIx->CR2 |= itmask;//开启中断允许

}

else

{

/* Disable the selected SPI/I2S interrupt */

SPIx->CR2 &= (u16)~itmask;

}

}

/*【09】函数SPI_I2S_DMACmd

******************************************************************************

* Function Name : SPI_I2S_DMACmd

* Description : Enables or disables the SPIx/I2Sx DMA interface.

* Input : - SPIx: where x can be :

* - 1, 2 or 3 in SPI mode

* - 2 or 3 in I2S mode

* - SPI_I2S_DMAReq: specifies the SPI/I2S DMA transfer request

* to be enabled or disabled.

* This parameter can be any combination of the following values:

* - SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request

* - SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request

* - NewState: new state of the selected SPI/I2S DMA transfer

* request.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/

SPI_DMAReq:SPI_DMAReq使能或者失能SPI Tx和/或SPI Rx的DMA传输请求。

例:

/* Enable SPI2 Rx buffer DMA transfer request */

SPI_DMACmd(SPI2, SPI_DMAReq_Rx, ENABLE);

函数原型如下:

void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, u16 SPI_I2S_DMAReq, FunctionalState NewState) {

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq));

if (NewState != DISABLE)

{

/* Enable the selected SPI/I2S DMA requests */

SPIx->CR2 |= SPI_I2S_DMAReq;//开启DMA请求。

}

else

{

/* Disable the selected SPI/I2S DMA requests */

SPIx->CR2 &= (u16)~SPI_I2S_DMAReq;

}

}

/*【10】函数SPI_I2S_SendData

******************************************************************************

* Function Name : SPI_I2S_SendData

* Description : Transmits a Data through the SPIx/I2Sx peripheral.

* Input : - SPIx: where x can be :

* - 1, 2 or 3 in SPI mode

* - 2 or 3 in I2S mode

* - Data : Data to be transmitted..

* Output : None

* Return : None

*******************************************************************************/ void SPI_I2S_SendData(SPI_TypeDef* SPIx, u16 Data)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

/* Write in the DR register the data to be sent */

SPIx->DR = Data;

}

/*【11】函数SPI_I2S_ReceiveData

******************************************************************************

* Function Name : SPI_I2S_ReceiveData

* Description : Returns the most recent received data by the SPIx/I2Sx peripheral. * Input : - SPIx: where x can be :

* - 1, 2 or 3 in SPI mode

* - 2 or 3 in I2S mode

* Output : None

* Return : The value of the received data.

*******************************************************************************/

u16 SPI_I2S_ReceiveData(SPI_TypeDef* SPIx)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

/* Return the data in the DR register */

return SPIx->DR;

}

/*【12】函数SPI_NSSInternalSoftwareConfig

******************************************************************************

* Function Name : SPI_NSSInternalSoftwareConfig

* Description : Configures internally by software the NSS pin for the selected

* SPI.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.

* - SPI_NSSInternalSoft: specifies the SPI NSS internal state.

* This parameter can be one of the following values:

* - SPI_NSSInternalSoft_Set: Set NSS pin internally

* - SPI_NSSInternalSoft_Reset: Reset NSS pin internally

* Output : None

* Return : None

* Note : NSS = Slave Select

*******************************************************************************/

SPI_NSSInternalSoft:内部设置或者重置NSS管脚。

Table.12-1 SPI_DMAReq值

/* Set internaly by software the SPI1 NSS pin */

SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);

/* Reset internaly by sofwtare the SPI2 NSS pin */

SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Reset);

函数原型如下:

void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, u16 SPI_NSSInternalSoft)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft));

if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset)

{

/* Set NSS pin internally by software */

SPIx->CR1 |= SPI_NSSInternalSoft_Set;

}

else

{

/* Reset NSS pin internally by software */

SPIx->CR1 &= SPI_NSSInternalSoft_Reset;

}

}

/*【13】函数SPI_SSOutputCmd

******************************************************************************

* Function Name : SPI_SSOutputCmd

* Description : Enables or disables the SS output for the selected SPI.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.

* - NewState: new state of the SPIx SS output.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/

void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected SPI SS output */

SPIx->CR2 |= CR2_SSOE_Set;// 0x0004,开启在主模式下SS输出,该设备不能工作在多主设备模式 }

else

{

/* Disable the selected SPI SS output */

SPIx->CR2 &= CR2_SSOE_Reset;// 0xFFFB,禁止在主模式下SS输出,该设备可以工作在多主设备模式 }

}

/*【14】函数SPI_DataSizeConfig

******************************************************************************

* Function Name : SPI_DataSizeConfig

* Description : Configures the data size for the selected SPI.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.

* - SPI_DataSize: specifies the SPI data size.

* This parameter can be one of the following values:

* - SPI_DataSize_16b: Set data frame format to 16bit.

* - SPI_DataSize_8b: Set data frame format to 8bit.

* Output : None

* Return : None

*******************************************************************************/

SPI_DataSize:设置8 位或者16位数据帧结构。

Table.14-1 SPI_DMAReq值

/* Set 8bit data frame format for SPI1 */

SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);

/*Set 16bit data frame format for SPI2 */

SPI_DataSizeConfig(SPI2, SPI_DataSize_16b);

函数原型如下:

void SPI_DataSizeConfig(SPI_TypeDef* SPIx, u16 SPI_DataSize)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_SPI_DATASIZE(SPI_DataSize));

/* Clear DFF bit */

SPIx->CR1 &= (u16)~SPI_DataSize_16b;//用“16b”值复位DFF位值。

/* Set new DFF bit value */

SPIx->CR1 |= SPI_DataSize;

}

/*【15】函数SPI_TransmitCRC

******************************************************************************

* Function Name : SPI_TransmitCRC

* Description : Transmit the SPIx CRC value.

* Input : - SPIx(Not Include I2Sx): where x can be 1, 2 or 3 to select the SPI peripheral. * Output : None

* Return : None

*******************************************************************************/

void SPI_TransmitCRC(SPI_TypeDef* SPIx)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

/* Enable the selected SPI CRC transmission */

SPIx->CR1 |= CR1_CRCNext_Set;// 0x1000,下一个发送CRC:1--下一个发送的值来自发送CRC寄存器

}//若为0--下一个发送的值来自发送缓冲区

/*【16】函数SPI_CalculateCRC

******************************************************************************

* Function Name : SPI_CalculateCRC

* Description : Enables or disables the CRC value calculation of the

* transfered bytes.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * - NewState: new state of the SPIx CRC value calculation.

* This parameter can be: ENABLE or DISABLE.

* Output : None

* Return : None

*******************************************************************************/ void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if (NewState != DISABLE)

{

/* Enable the selected SPI CRC calculation */

SPIx->CR1 |= CR1_CRCEN_Set;// 0x2000,硬件CRC校验使能:开启CRC计算

}

else

{

/* Disable the selected SPI CRC calculation */

SPIx->CR1 &= CR1_CRCEN_Reset;// 0xDFFF

}

}

/*【17】函数SPI_GetCRC

******************************************************************************

* Function Name : SPI_GetCRC

* Description : Returns the transmit or the receive CRC register value for

* the specified SPI.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * - SPI_CRC: specifies the CRC register to be read.

* This parameter can be one of the following values:

* - SPI_CRC_Tx: Selects Tx CRC register

* - SPI_CRC_Rx: Selects Rx CRC register

* Output : None

* Return : The selected CRC register value..

*******************************************************************************/ SPI_CRC:SPI_CRC选择SPI Rx 或SPI Tx的 CRC 寄存器。

例:

/* Returns the SPI1 transmit CRC register */

u16 CRCValue;

CRCValue = SPI_GetCRC(SPI1, SPI_CRC_Tx);

函数原型如下:

u16 SPI_GetCRC(SPI_TypeDef* SPIx, u8 SPI_CRC)

{

u16 crcreg = 0;

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_SPI_CRC(SPI_CRC));

if (SPI_CRC != SPI_CRC_Rx)//如果是TXCRC,读TXCRCR

{

/* Get the Tx CRC register */

crcreg = SPIx->TXCRCR;

}

else//否则是RXCRC,读RXCRCR

{

/* Get the Rx CRC register */

crcreg = SPIx->RXCRCR;

}

/* Return the selected CRC register */

return crcreg;

}

/*【18】函数SPI_GetCRCPolynomial

******************************************************************************

* Function Name : SPI_GetCRCPolynomial

* Description : Returns the CRC Polynomial register value for the specified SPI. * Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * Output : None

* Return : The CRC Polynomial register value.

*******************************************************************************/

u16 SPI_GetCRCPolynomial(SPI_TypeDef* SPIx)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

/* Return the CRC polynomial register */

return SPIx->CRCPR;//u16

}

/*【19】函数SPI_BiDirectionalLineConfig

******************************************************************************

* Function Name : SPI_BiDirectionalLineConfig

* Description : Selects the data transfer direction in bi-directional mode

* for the specified SPI.

* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * - SPI_Direction: specifies the data transfer direction in

* bi-directional mode.

* This parameter can be one of the following values:

* - SPI_Direction_Tx: Selects Tx transmission direction

* - SPI_Direction_Rx: Selects Rx receive direction

* Output : None

* Return : None

*******************************************************************************/

SPI_Direction:SPI_Direction选择SPI在双向模式下的数据传输方向。

Table.19-1 SPI_CRC值

例:

/* Set the SPI2 in bidirectional transmit only mode */

SPI_BiDirectionalLineConfig(SPI_Direction_Tx);

函数原型如下:

void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, u16 SPI_Direction)

{

/* Check the parameters */

assert_param(IS_SPI_ALL_PERIPH(SPIx));

assert_param(IS_SPI_DIRECTION(SPI_Direction));

if (SPI_Direction == SPI_Direction_Tx)

{

/* Set the Tx only mode */// 该位和BIDIMODE(=1)位一起决定在“单线双向”模式下数据的传输方向 SPIx->CR1 |= SPI_Direction_Tx;// 1(输出使能(只发模式))

}

else

{

/* Set the Rx only mode */

SPIx->CR1 &= SPI_Direction_Rx;// 0(输出禁止(只收模式))

}

}

/*【20】函数SPI_I2S_GetFlagStatus

******************************************************************************

* Function Name : SPI_I2S_GetFlagStatus

* Description : Checks whether the specified SPI/I2S flag is set or not.

* Input : - SPIx: where x can be :

* - 1, 2 or 3 in SPI mode

* - 2 or 3 in I2S mode

* - SPI_I2S_FLAG: specifies the SPI/I2S flag to check.

* This parameter can be one of the following values:

* - SPI_I2S_FLAG_TXE: Transmit buffer empty flag.

* - SPI_I2S_FLAG_RXNE: Receive buffer not empty flag.

* - SPI_I2S_FLAG_BSY: Busy flag.

* - SPI_I2S_FLAG_OVR: Overrun flag.

* - SPI_FLAG_MODF: Mode Fault flag.

* - SPI_FLAG_CRCERR: CRC Error flag.

常用的硬件接口及通信协议详解

一:串口 串口是串行接口的简称,分为同步传输(USRT)和异步传输(UART)。在同步通信中,发送端和接收端使用同一个时钟。在异步通信中,接受时钟和发送时钟是不同步的,即发送端和接收端都有自己独立的时钟和相同的速度约定。 1:RS232接口定义 2:异步串口的通信协议 作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。图一给出了其工作模式: 图一 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=1200波特。 3:在嵌入式处理器中,通常都集成了串口,只需对相关寄存器进行设置,就可以使用啦。尽管不同的体系结构的处理器中,相关的寄存器可能不大一样,但是基于FIFO的uart框图还是差不多。

发送过程:把数据发送到fifo中,fifo把数据发送到移位寄存器,然后在时钟脉冲的作用下,往串口线上发送一位bit数据。 接受过程:接受移位寄存器接收到数据后,将数据放到fifo中,接受fifo事先设置好触发门限,当fifo中数据超过这个门限时,就触发一个中断,然后调用驱动中的中断服务函数,把数据写到flip_buf 中。 二:SPI SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

用C#一步步写串口通信分析解析

我们来看具体的实现步骤。 公司要求实现以下几个功能: 1):实现两台计算机之前的串口通信,以16进制形式和字符串两种形式传送和接收。 2):根据需要设置串口通信的必要参数。 3):定时发送数据。 4):保存串口设置。 看着好像挺复杂,其实都是纸老虎,一戳就破,前提是你敢去戳。我尽量讲的详细一些,争取说到每个知识点。 在编写程序前,需要将你要测试的COM口短接,就是收发信息都在本地计算机,短接的方式是将COM口的2、3号针接起来。COM 口各针的具体作用,度娘是这么说的:COM口。记住2、3针连接一定要连接牢固,我就是因为接触不良,导致本身就不通,白白花掉了一大半天时间调试代码。 下面给出主要的操作界面,如下:

顺便,我将所有控件对应的代码名字也附上了,相信对初学者来说,再看下面的代码会轻松很多。控件名字命名的方法是“控件名+作用”的形式,例如“打开串口”的开关按钮,其名字是btnSwitch (btn就是button的简写了)。我认为这种命名控件的方式比较好,建议大家使用,如果你有好的命名方式,希望你能告诉我! 下面我们将各个功能按照从主到次的顺序逐个实现。(我分块给出代码实现,详细代码见链接:《C#串口通信工具》)

一、获取计算机的COM口总个数,将它们列为控件cbSerial的候选项,并将第一个设为cbSerial的默认选项。 这部分是在窗体加载时完成的。请看代码: (很多信息代码的注释里讲的很清楚,我就不赘述了。) [csharp]view plaincopyprint? 1.//检查是否含有串口 2. string[] str = SerialPort.GetPortNames(); 3. if (str == null) 4. { 5. MessageBox.Show("本机没有串口!", "Error"); 6. return; 7. } 8. 9. //添加串口项目 10. foreach (string s in System.IO.Ports.SerialPort.GetPortNames()) 11. {//获取有多少个COM口 12. cbSerial.Items.Add(s); 13. } 14. 15. //串口设置默认选择项

IC卡通信协议详解(7816-3)

目录 第一章IC卡通信过程整体归纳 (1) 第二章IC卡的电气特性 (3) 1.IC卡的触点分配 (3) 2.IC卡的电气特性 (3) 2.1 VCC (3) 2.2 I/O (3) 2.3 CLK (3) 2.4 RST (3) 2.2 VPP (3) 第三章IC卡的操作过程 (4) 1、IC卡操作的一般过程 (4) 2、卡激活 (4) 3、冷复位 (4) 4、热复位 (5) 5、时钟停止 (6) 6、去激活 (6) 第四章复位应答 (8) 1、异步字符 (8) 1.1 字符结构 (8) 1.2 错误信号和字符副本 (8) 2、复位应答 (9) 2.1 复位应答的序列配置 (9) 2.2 复位应答的结构和内容 (11) 第五章协议和参数选择 (14) 1.PPS协议 (14) 2.PPS请求的结构和内容 (14) 3.成功的PPS交换 (14) 第六章异步半双工字符传输协议 (16) 1、命令的结构和处理 (16) 2、过程字节 (16) 3、NULL字节 (16) 4、确认字节 (16) 5、状态字节 (17) 第七章异步半双工块传输 (18) 1.数据块块帧结构 (18) 2.起始域 (18) 3.信息域 (18) 4.终止域 (19) 5.信息域尺寸 (19) 6.等待时间 (19) 7.数据链路层字符成分 (20) 8.数据链路层块成分 (20) 9.链接 (20)

第一章IC卡通信过程整体归纳 根据协议,IC卡的操作信息交互流程大概为(见图1): (1)接口设备能够控制IC卡各IO引脚使其激活。 (2)接口设备给卡发送复位信号使卡复位启动。 (3)卡要向接口设备发送复位应答信号,将通信中必要的相关信息告知接口设备。(4)接口设备对卡进行一次热复位,卡进行复位应答。 (5)接口设备发起一个PPS交互指令,选择要与卡通信的协议和相关参数。 (6)根据选择的协议(T=0或T=1)进行数据的通信。

用GPIO模拟SPI协议的实现

一SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI (数据输入),SDO(数据输出),SCK(时钟),CS(片选)。 (1)SDO –主设备数据输出,从设备数据输入 (2)SDI –主设备数据输入,从设备数据输出 (3)SCLK –时钟信号,由主设备产生 (4)CS –从设备使能信号,由主设备控制

其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。 接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。 要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

RS232串口通讯详解

串口通讯—RS-232-C详解 蓝鸟发表于 2005-9-22 16:19:34 串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过改进而形成的。所以,以RS-232C为主来讨论。RS-323C标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。它适合于数据传输速率在0~20000b/s范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。 在讨论RS-232C接口标准的内容之前,先说明两点: 首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。因此这个标准的制定,并未考虑计算机系统的应用要求。但目前它又广泛地被借来用于计算机(更准确的说,是计算机接口)与终端或外设之间的近端连接标准。显然,这个标准的有些规定及和计算机系统是不一致的,甚至是相矛盾的。有了对这种背景的了解,我们对RS-232C标准与计算机不兼容的地方就不难理解了。 其次,RS-232C标准中所提到的“发送”和“接收”,都是站在DTE立场上,而不是站在DCE的立场来定义的。由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,因此双方都能发送和接收。 一、RS-232-C RS-232C标准(协议)的全称是EIA-RS-232C标准,其中EIA(Electronic Industry Association)代表美国电子工业协会,RS(ecommeded standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有有EIA�RS-232-C、EIA�RS-422-A、 EIA�RS-423A、EIA�RS-485。这里只介绍EIA�RS-232-C(简称232,RS232)。例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。 1.电气特性 EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上:逻辑1(MARK)=-3V~-15V 逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压)=-3V~-15V

思科X.25协议详解

C H A P T E R 17Chapter Goals ? Discuss the history and development of the X.25 protocol.? Describe the basic functions and components of X.25.?Describe the frame formats of X.25. X.25 Introduction X.25 is an International Telecommunication Union–Telecommunication Standardization Sector (ITU-T) protocol standard for WAN communications that defines how connections between user devices and network devices are established and maintained. X.25 is designed to operate effectively regardless of the type of systems connected to the network. It is typically used in the packet-switched networks (PSNs) of common carriers, such as the telephone companies. Subscribers are charged based on their use of the network. The development of the X.25 standard was initiated by the common carriers in the 1970s. At that time, there was a need for WAN protocols capable of providing connectivity across public data networks (PDNs). X.25 is now administered as an international standard by the ITU-T. X.25 Devices and Protocol Operation X.25 network devices fall into three general categories: data terminal equipment (DTE), data circuit-terminating equipment (DCE), and packet-switching exchange (PSE). Data terminal equipment devices are end systems that communicate across the X.25 network. They are usually terminals, personal computers, or network hosts, and are located on the premises of individual subscribers. DCE devices are communications devices, such as modems and packet switches, that provide the interface between DTE devices and a PSE, and are generally located in the carrier’s facilities. PSEs are switches that compose the bulk of the carrier’s network. They transfer data from one DTE device to another through the X.25 PSN. Figure 17-1 illustrates the relationships among the three types of X.25 network devices.

IO口模拟SPI口

模块名称:spi.h 模块说明: c51单片机的i/o模拟spi操作 创建时间: 2005/03/09 创建者: xichen ******************************************************************************* */ #ifndef SPI_H #define SPI_H sbit SPIS_N = P2^1; sbit SPIC = P2^3; sbit SPID = P2^2; sbit SPIQ = P2^4; extern void spi_reset(); extern void spi_write(unsigned char spi_bValue); extern unsigned char spi_read();

#endif /****************************************************************************** * 模块名称:spi.c 模块说明: c51单片机的i/o模拟spi操作 创建时间: 2005/03/09 创建者: xichen ******************************************************************************* */ #include "includes.h" #define set_spi_cs() SPIS_N =1 #define clr_spi_cs() SPIS_N =0 #define set_spi_clk() SPIC =1 #define clr_spi_clk() SPIC =0 #define set_spi_di() SPID =1 #define clr_spi_di() SPID =0 #define read_spi_do() SPIQ

常用无线网络通信技术解析

常用无线网络通信技术解析 发表时间:2017-10-19T10:33:32.157Z 来源:《基层建设》2017年第17期作者:陶庆东 [导读] 摘要:随着我国信息技术不断发展,促进了无线网络通信技术的不断进步,出现了GPS检测、挖掘机器人设计等相关技术,在实际应用过程中,发挥了至关重要的作用,因此本文主要探讨了常用无线网络通信技术,旨在为相关工作者提供借鉴。 广东省电信工程有限公司广东东莞 523000 摘要:随着我国信息技术不断发展,促进了无线网络通信技术的不断进步,出现了GPS检测、挖掘机器人设计等相关技术,在实际应用过程中,发挥了至关重要的作用,因此本文主要探讨了常用无线网络通信技术,旨在为相关工作者提供借鉴。 关键词:无线网络;通信技术;分析 无线网络随着局域网的发展而不断发展,无线网络不需要进行布线,就可以实现信息传输,为人们的通信提供了较大的便利。无线网络不仅具有质量高的优点,同时还可以降低通信成本,所以在许多的领域中,都可以应用无线网络通信,以此提高各领域的工作效率,充分发挥无限网络的的应用优势。目前我国无线网络通信技术有很多种,与人们的生活也息息相关,所以应常用网线网络技术的深入的分析,以此不断提高无线网络通信技术水平。 1 无线广域网 无线广域网不仅可以实现与私人网络进行无线连接,同时还可以与遥远的观众进行无限连接。在无限广域网中,常使用的通信技术,主要有以下几种,GPS、GSM、以及3G,下面就针对这三种技术进行探讨。 1.1 GPS GPS是一项重要的定位技术,其主要基础为子午仪卫星导航系统,它可以在海陆空进行三维导航,同时还具有较强的定位能力,美国在1994年全面建成。GPS系统主要由GPS卫星星座、地面监控系统以及GPS信号接收机三部分组成,GPS系统的卫星共有24颗,它们在轨道平面上均匀分布,其主要负责两方面工作,其一是对卫星进行监控,其二计算卫星星历;对于GPS用户设备主要由两部分组成,一部分为GPS信号接收机硬件,另一部分为GPS信号接收机处理软件。GPS在工作过程中,通常利用GPS信号接收机,对GPS卫星信号进行接收,并对信号进行相应的处理,进行确定相关的信息,包括用户位置以及速度等等,以此实现GPS定位以及导航的目的。GPS系统具有一定的特点,包括操作简便、高效率以及多功能等,最初,在军事领域中应用GPS,随着GPS系统的不断发展,GPS应用范围越来越广,在民用领域中应用力度逐渐加大,特别是在工程测量中,可以实现全天候的准确监测,大大提高了工程测量的精度,促进工程测量的行业的不断发展。 1.2 GSM GSM是全球移动通信系统的简称,是蜂窝系统之一。GSM发展的较为迅速,在欧洲和亚洲,已经将GSM作为标准,目前在世界上许多的国家,都建立的GSM系统,这主要是因为GSM系统具有一定的优势,如稳定性强、通话质量高、以及网络容量等等,这主要是因为GSM系统在工作中,可以实现多组通话在同一射频进行,GSM系统一般主要有包括三个频段,即1800MHZ、900MHz以及1900MHz。 1.3 GPRS GPRS是指通用分组无线业务,它是一种新的分组传输技术,在应用过程中,GPRS具有较多的优点,包括广域的无线IP连接、接口传输速率块等等。在GPRS系统运行过程中,通过分组交换技术,一方面可以实现多个无线信号共一个移动用户使用,另一方面可以实现一个无线信道共多个移动用户使用。信道资源会在移动用户进行无数据传输过程中让出来,这样可以实现无线频带资源利用率的提升。 2 无线局域网 无线局域网主要指的网络传输主要通过无线媒介,包括无线电波以及红外线等。对于无线局域网通信技术覆盖范围,一般情况下,在半径100m左右,目前IEEE制订的无线局域网标准,主要采用的是IEEE802.11系列标准,对于网络的物理层,作出的主要规定,同时还规定了媒质访问控制层。该系列的标准有很多种,包括IEEE802.11、IEEE802.11a、IEEE802.11b等等,对此进行简单的介绍。 2.1 IEEE802.11 对于无线局域网络,最早的网络规定为IEEE802.11,2.4GHZ的ISM工作频段是其工作的主要频段,物理层主要采用技术主要有两项,即红外线技术、跳频扩频技术等等,主要能够解决两项问题,一种为办公室局域网问题,另一种为校园网络用户终端无线接入问题。IEEE802.11数据传输速率可以达到2Mbps,随着我国网络技术的发展,IEEE802.11也得到了研究和发展,陆续推出了IEEE802.11b和IEEE802.11a,其中陆续推出了IEEE802.11b的数据传输速率可以达到11Mbps,IEEE802.11a的数据传输速率可以达到54Mbps,以此满足不断发展的高带宽带网络应用的需要、 2.2 IEEE802.11b 在现实生活使用中,我们可以将IEEE802.11b称作为Wi-Fi,2.4GHz频带是IEEE802.11b工作主要的频带之一,物理层主要由支持两个速率,即5.5Mbps和11Mbps,IEEE802.11b传输速率会受许多因素的影响,包括环境干扰和传输距离等,传输速率可以进行相应的切换。直接序列扩频DSSS技术是IEEE802.11b主要采用的技术。对于IEEE802.11b,可以将其工作模式可以分为两种,一种为点对点模式,另一种为基本模式,其中点对点模式是指两个无线网卡计算机之间的相互通信;基本模式还包括两种通信方式,一种为无线网络的扩充的时的通信方式,另一种指的是有线网络并存时的通信方式。 2.3IEEE802.11a 在美国,IEEE802.11a主要有三个频段范围,即5.15-5.25GHz、5.725-5.825GHz,物理层和传输层的速率可以达到54Mbps和 25Mbps,正交频分复用的独特扩频技术是IEEE802.11a主要采用的技术,通过该技术,可以实现传输范围的扩大,同时对于数据加密,可以达到152位的WEP。 3 无线个域网 在网络架构的底层,设置无线个域网WPAN,一般点对点的短距离连接使用无线个域网。对于无线个域网,使用的通信技术包括红外、蓝牙以及UWB等等,对此下面进行详细的介绍和分析。 3.1 蓝牙 蓝牙作为一种短距离无线通信技术,主要应用小范围的无线连接。蓝牙技术的传输速率为1Mbps,有效的通信范围在10m-100m范围,2.4GHz频段是蓝牙运行的频段,传输速率可以通过GFSK调制技术来实现,同时通过FHSS扩频技术还可以将信道分成若个的时隙,

RS232串口通信详解

串口就是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 9芯信号方向来自缩写描述 1调制解调器CD载波检测 2调制解调器RXD接收数据 3PC TXD发送数据 4PC DTR数据终端准备好 5GND信号地 6调制解调器DSR通讯设备准备好 7PC RTS请求发送 8调制解调器CTS允许发送 9调制解调器RI响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离就是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值就是5、7与8位,如何设置取决于您想传送的信息。比如,标准的ASCII码就是0~127(7位);扩展的ASCII码就是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1、5与2位。由于数就是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅就是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶与奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据就是011,那么对于偶校验,校验位为 0,保证逻辑高的位数就是偶数个。如果就是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式: 串行通信中,线路空闲时,线路的TTL电平总就是高,经反向 RS232的电平总就是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总就是从低位向高位一位一位的传输。示波器读数时,左边就是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)与图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

RIP路由协议详解

RIP路由协议(Routing Information Protocols,路由信息协议)是使用最广泛的距离向量协议,它是由施乐(Xerox)在70年代开发的。当时,RIP是XNS (Xerox Network Service,施乐网络服务)协议簇的一部分。TCP/IP版本的RIP是施乐协议的改进版。RIP最大的特点是,无论实现原理还是配置方法,都非常简单。 度量方法RIP的度量是基于跳数(hops count)的,每经过一台路由器,路径的跳数加一。如此一来,跳数越多,路径就越长,RIP算法会优先选择跳数少的路径。RIP支持的最大跳数是15,跳数为16的网络被认为不可达。 路由更新RIP路由协议中路由的更新是通过定时广播实现的。缺省情况下,路由器每隔30秒向与它相连的网络广播自己的路由表,接到广播的路由器将收到的信息添加至自身的路由表中。每个路由器都如此广播,最终网络上所有的路由器都会得知全部的路由信息。正常情况下,每30秒路由器就可以收到一次路由信息确认,如果经过180秒,即6个更新周期,一个路由项都没有得到确认,路由器就认为它已失效了。如果经过240秒,即8个更新周期,路由项仍没有得到确认,它就被从路由表中删除。上面的30秒,180秒和240秒的延时都是由计时器控制的,它们分别是更新计时器(_updateTimer)、无效计时器(Invalid Timer)和刷新计时器(Flush Timer)。 路由循环距离向量类的算法容易产生路由循环,RIP路由协议是距离向量算法的一种,所以它也不例外。如果网络上有路由循环,信息就会循环传递,永远不能到达目的地。为了避免这个问题,RIP等距离向量算法实现了下面4个机制。 水平分割(split horizon)。水平分割保证路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它。这是保证不产生路由循环的最基本措施。 毒性逆转(poison reverse)。当一条路径信息变为无效之后,路由器并不立即将它从路由表中删除,而是用16,即不可达的度量值将它广播出去。这样虽然增加了路由表的大小,但对消除路由循环很有帮助,它可以立即清除相邻路由器之间的任何环路。 触发更新(trigger update)。当路由表发生变化时,更新报文立即广播给相邻的所有路由器,而不是等待30秒的更新周期。同样,当一个路由器刚启动RIP 路由协议时,它广播请求报文。收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期。这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性。 抑制计时(holddown timer)。一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新。如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效。这个有效的信息往往是不正确的,抑制计时避免了这个问题,而且,当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性。 即便采用了上面的4种方法,路由循环的问题也不能完全解决,只是得到了最大程度的减少。一旦路由循环真的出现,路由项的度量值就会出现计数到无穷大(_countto Infinity)的情况。这是因为路由信息被循环传递,每传过一个路由器,度量值就加1,一直加到16,路径就成为不可达的了。RIP路由协议选择16作为不可达的度量值是很巧妙的,它既足够的大,保证了多数网络能够正常运行,又足够小,使得计数到无穷大所花费的时间最短。 邻居有些网络是NBMA(Non-Broad_cast MultiAccess,非广播多路访问)

WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下: 函数名作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口 用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、创建串口句柄,用CreateFile; 2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数; 4、读写结束后,要关闭串口句柄,用CloseFile。 下面依次讲述各个步骤的过程。

单片机软件模拟SPI接口—加深理解SPI总线协议

SPI — SPI SPI(Serial Peripheral Interfacer ) SPI RAM EEPROM FlashROM A D D A LED LED I O UART SPI I O SPI I O AT89C205l SPI EEPROM 93CA6 1 I O SPI 93C46 SPI 93CA6 SPI 4 I O (SK) DO DI CS (MSB) (LsB) 93C46 SPI 2

SPI SPI AT89C2051 SPI 1 AT89C2051 EEPROM 93C46 P1 0 SPI SDO P1 2 SPI SCK P1 3 SPI SCS P1 1 SPI SDI P1 2(SCK) 0( ) AT89C2051 P1 0 1 (1) 2 (10) 6 (A5A4A3A2A1A0) P1 1 1 (0) l6 ( ) AT89C2051 P1 0 1 (1) 2 (01) 6 (A5A4A3A2A1A0) P1 0 l6 ( ) (WEN)) 1 (1) 2 (00) 6 (11XXXX) (WDS)) 1 (1) 2 (00) 6 (00XXXX) C51 SPI // I/O sbit SDO=P1^0 sbit SDI=P1^1 sbit SCK=P1^ 2 sbit SCS=P1^3 sbit ACC_7= ACC^7 unsigned int SpiRead(unsigned char add) { unsigned char i unsigned int datal6 add&=0x3f /*6 */ add |=0x80 /* l0*/ SDO=1 /* 1 */ SCK=0 SCK=1 for(i=0 i<8 i++)/* */ { if(add&0x80==1) SDO=1 else SDO=0 SCK=0 /* */ SCK=1 add<<= 1 } SCK=1 /* 1 */

51单片机模拟 SPI 总线的方法

51单片机模拟 SPI 总线的方法 1 引言 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。由此可见,在MCS51系列等不具有SPI接口的单片机组成的智能仪器和工业测控系统中,当传输速度要求不是太高时,使用SPI总线可以增加应用系统接口器件的种类,提高应用系统的性能。 2 SPI总线的组成 利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU 相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。SPI总线接口系统的典型结构。 当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因此只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。 3 在MCS-51系列单片机中的实现方法 对于不带SPI串行总线接口的MCS-51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接收后再置P1.1为0。这样,MCU 在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS-51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS-51系列单片机从P1.0(模拟MCU 的MOSI线)输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入输出便宣告完成。此后再置P1.1为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置P1.1为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。 图2所示为MCS-51系列单片机与存储器X25F008(E2PROM)的硬件连接图,图2中,P1.0

C#串口通信:MSComm控件使用详解

C#串口通信:MSComm控件使用详解 目次 MSComm 控件两种处理通讯的方式 CommPort 属性 RThreshold 属性 CTSHolding 属性 SThreshold 属性 CDHolding 属性 DSRHolding 属性 Settings 属性 InputLen 属性 EOFEnable 属性 Handshake 常数 OnComm 常数 InputMode 常数 错误消息 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 1.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。 1.2 查询方式 查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 2.MSComm 控件的常用属性 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述:

串口通信协议详解

对单一设备的控制操作比较方便,但是要实现对多个设备的控制就不那么简单了。它需要的时序、接口标准、通信协议等相互配合,才能够实现相互之间的通信。最近开始了《智能化车位指示管理系统》的设计,才体会到设计者的艰辛。设计既是体力劳动,又是脑力劳动。说他是体力劳动是因为在这期间有很多重复性的工作,至于脑力劳动那是不言而喻。作为一个菜鸟级的设计人员来说,多多借鉴前人设计思路不愧是一个“捷径”,毕竟站得高看得远嘛! 串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 一、RS-232串行接口标准 目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL 电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V 至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20Kbps。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3kΩ~7kΩ。所以RS-232适合本地设备之间的通信。 二、RS-422串行接口标准 RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。实际上还有一根信号地线,共5根线。由于接收器采用高输入阻抗和发送驱动器比RS232 更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。 RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

相关主题
文本预览
相关文档 最新文档