Other Parts Discussed in Thread: MSP430G2553, MSP-FET
主题中讨论的其他器件:MSP-FET430UIF、 MSP430WARE、 MSP-FET
问题概要-- DSP 芯片运行 SPI I/F 的速度对于 G2553芯片来说太快、无法作为从器件处理 SPI 流量、因此在下降位置重新调整了 G2553代码、使其以 ~9600位/秒的悠闲速率作为 SPI 主器件(而不是将 DSP 作为从器件)工作
尽可能地尝试、我只能获得一个多字符传输的第一个中断、并且在字节被放置在 ISR 中的 TXBUF 中之后、没有 SPI 时钟或 SOMI 时钟或位从端口发出、这是人们所期望的 (使用 SALEAE Pro Logic16分析仪检查 SPI I/F、以包含按预期工作的 SPI 使能信号。
相关事实: 我已确保 SMCLK 是指定的时钟、我已在《系列用户指南》、《产品审查指南》和勘误表文档(所有这些文档均已验证为最新版本)中详细介绍、查找缺少的任何初始化、时钟、 或控制信息、但不能找到任何"错误"、即使常识指出必须存在。 我找到了对 ME2 SFR 的引用根据 MSP-FET430UIF 去调试器屏幕、在调试模式下使用带有7.11.1构建链的 IAR 8.0、G2553不支持、并且该控制寄存器不显示-- 我认为我发现问题的原因是 SPI 外设未启用、但结果是"错误"。 此消息后面有两个代码块- G2553 SPI 主控初始化、带有 putstr (Put String)函数和 RX/TX ISR、以及 F28069 DSP 芯片的另一个 SPI 从器件块。 由于 G2553不能作为适当的主器件工作、因此应将重点放在该主器件上、而 DSP 代码仅作为完整性代码。 我是一名经验丰富的嵌入式固件开发人员、具有8位、16位和32位处理器经验、拥有摩托罗拉、TI、ST-Micro 和 Infineon 处理器代码、并通过 RS232、RS485、SPI 和 I2C 成功开发了多种接口、从未偶然发现过类似此类的头刮擦器。 哦!
症状: 端口的所有外观都没有实际运行-- TXBUF 被加载但没有传输 SPI 时钟或数据-- 就像移位寄存器输出端口引脚不运行或者不能运行一样、从而防止 TXBUF IFG 位被设置为下一个字节。
请帮助。
尊敬的、
Keith Abell
IntelliPower Inc.高级固件工程师
=================== MSP430G2553器件中的目标 SPI 主器件代码-初始化和 ISR /*
! μ@文件 ucb0_spi.c
*@作者 Keith Abell
*
*@简介 为处理器执行 UCB0 SPI 接口功能。
*
*目标: MSP430G2553器件
*
void 初始化 UCB0_SPI (void)
{
UCB0CTL1__SPI = UCSWRST; //禁用 UCB 外设
UCB0CTL0__SPI = UCMSB | UCMODE_2 | UCSYNC; // MSB 优先作为从器件、4引脚 STE 有源低电平、同步
// UCB0CTL0__SPI |= UCCKPH + UCCKPL; //目前,使用相位/极性= 00,数据 chg 在上升沿,捕获在后沿,时钟通常为低电平
UCB0CTL1__SPI |= UCSSEL_2; // SMCLK,启用。 USCI 逻辑保持在复位状态
UCB0CTL0__SPI |= UCMST; //或在主控模式控制位
// crystal_X2为16MHz,在另一个.h 文件
#define BAUDRATE ((crystal_X2/SPIbaudRATE))中定义 //将 BAUDRATE 舍入到近集整数中--使用 system_ModF_Proc.h 上的晶振和 SPIBAAUDRATE
UCB0BR0__SPI =(0xFF & AUDRATE)+1; //设置低阶波特率寄存器、舍入1
UCB0BR1__SPI =(0xFF &(BAUDRATE>>8)); //设置高阶波特率寄存器--- Buadrate =(256*hivalue)+lowvalue
UCB0CTL1__SPI &=~(无符号整型) UCSWRST; //启用 UCB 外设
USART_RX_INT_ENABLE;
// USART_TX_INT_ENABLE; //仅在准备发送消息时打开 TX 中断
返回; // Bye
} //初始化结束 UCB0_SPI
//注意:测试字符串在 main.c 中定义,并调用此例程来启动 xfer,方法是简单地使芯片启用并在 SPI RX 和 TX 中断上进行设置,方法是使用下面显示的宏设置相应的 IE2启用位...
void USART_putstr (char *字符串)
{
USART_TX_char_count = strlen (字符串);
if (USART_TX_CHAR_COUNT <= USART_TXBUFSIZE)
{
DSP_CE_ENABLE; //打开 SPI 使能与 DSP 通信
USART_TX_INT_ENABLE; //确保 TX 中断被启用--注意:一旦所有字符被传输,TX 中断将被 ISR 关闭
USART_RX_INT_ENABLE; // Ditto RX 中断
}
}
// USCIAB0RX 中断服务例程
#pragma vector = USCIAB0RX_vector
__interrupt void USCIAB0RX (void)
{
//这是一个 RX 中断
静态无符号字符 tempchar;
IF (IFG2 & UCB0RXIFG)
{
tempchar = UCB0RXBUF; //清除 UCB0RXIFG
temp_Rx_buffer[temp_Rx_idx+]= UCB0STAT__SPI;//将错误标志保存在循环缓冲器中
if (temp_Rx_idx ==(USART_RXBUFSIZE +1))
{
TEMP_Rx_idx = 0;
}
if (USART_Rx_char_count = USART_RXBUFSIZE)
{
返回;
}
if ( tempchar != SYN ) //不要存储同步空闲字符--只是空闲
{
USART_Rx_buffer[USART_Rx_write_index++]= tempchar; //存储接收到的字节并包括接收索引
if (USART_Rx_WRITE_INDEX =(USART_RXBUFSIZE + 1)) //如果写入索引刚刚递增超过缓冲区大小,则将其复位
{
USART_Rx_WRITE_INDEX = 0;
}
USART_Rx_char_count++; //收到 char、包括 count
switch (tempchar)
{
案例 STX:
mspData.StartOfMsgFlag = true; //接收到的消息的信号开始
中断;
案例 ETX:
mspData.RcvDSPmsgFlag = true; //接收到的消息的信号结束--将需要检查简单的校验和
USART_Rx_buffer[USART_Rx_WRITE_index+]=空; //在 ETX 之后将空填充到缓冲区中以进行字符串处理
如果(USART_Rx_WRITE_INDEX =(USART_RXBUFSIZE +1)//如果写入索引刚刚递增超过缓冲区大小,则将其复位
{
USART_Rx_WRITE_INDEX = 0;
}
中断;
默认值: //好的,不是特殊的字符,继续
中断;
}
}
}
// USCIAB0TX 中断服务例程
#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX (void)
{
IF (IFG2 & UCB0TXIFG)
{
//这是一个 TX 中断
如果(USART_TX_CHAR_COUNT > 0) //如果字符在缓冲区中则发送
{
UCB0TXBUF = mspData.msgStr[USART_TX_READ_index+];//加载 TX 寄存器、包括索引
if (USART_TX_READ_INDEX =(USART_TXBUFSIZE +1)) //如果索引的增量大于最大值,则复位为0
{
USART_TX_READ_INDEX = 0;
}
USART_TX_CHAR_COUNT--; //已发送字符、解码计数
//LedUPS1 (LED_RED);
// do _a_nop;
}
其他
{
// KRA edit --如果我们要进行传输以获得发送到 DSP 的命令的响应,则需要修改此项以发送默认字符(SYN)。 目前、只需关闭 TX INT enable
//即可 我正在尝试让消息传输作为主设备来工作,而不是那么担心接收和虚拟传输来从
//获取响应 DSP 作为从器件
// UCB0TXBUF = SYN; //缓冲区为空,发送同步--不会超时,除非 Masteer (DSP)向我们发送了一些东西
//并且我们已启用(spien1 HIGH)。
USART_TX_INT_DISABLE; //关闭 TX 中断
}
}
}===========================
FMS320F28069器件中的目标从器件代码-初始化和 ISR 的
/*! μ@文件 HAL_SPI_FLASH.c
* @作者 Keith Abell
* @简介 对连接到外部串行 SPI 闪存器件和 MSP430的 SPI 接口执行硬件访问级别控制。
*
*目标: TMS320F28069器件
*
// KRA 编辑--这个初始化例程现在将 DSP 设置为从器件-- 我们初始化 SPI 时钟子系统寄存
器、但由于// SPI 主设备位未设置、SPI 时钟将被忽略、并且仅取决于作为主设备的 G2553 SPI 时钟。
void init_hal_spi_flash (void)
{
unsigned int i;
flash_ce_disable; //取消选择 SPI 串行闪存(输出为高电平)
MSP430_CE_DISABLE; //取消选择 MSP430 (输出为高电平)
spiPort.rxWriteIndex = spiPort.rxReadIndex = spiPort.rxCharCount = 0;//刷新并准备 SPI 接收缓冲
区 WritPort.txeIndex = spiPort.rxReadIndex = spiPort.spiCharCount = 0;//刷新并准备 SPI 发送缓冲
区 spiPort.checkCount = 0;
spiESRCR.SpiSpiSpiET.SpiReadIndex = 0;SPICESCR.SpiRBIT.SpiSpiSpiSpiSpiSpiR //重置 DSP
EALLOW 上的 SPI 接口; //允许对寄存
器 PieVectTable.SPIRXINTA 的受保护访问=&spiaFlashReceiveIsr; //为接收
PieVectTable.SPITXINTA 设置中断例程=&spiaFlashTransmitIsr; //设置发送
EDIS 的中断例程; //禁止对寄存器
EALLOW 的受保护访问; //允许对寄存器
GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0的受保护访问; // SPI 使能0 -串行闪存、配置为 GPIO
GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0; //*启用上拉
GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1; //使该引脚成为输出
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0; // SPI 使能1 -本地 MSP430实时时钟、配置为 GPIO
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; //*启用上拉
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1; //使该引脚成为输出
GpioCtrlRegs.GPAPUD.bit.GPIO5=0; //*启用 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAQSEL1.bit.GPIO5=3; //异步输入 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPADIR.bit.GPIO5 = 1; // SPISIMOA 是输出 GPIO
GpioCtrlRegs.GPAMUX1.bit.GPIO5=2; //将 GPIO5配置为 SPISIMOA
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; //*启用 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; //异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPADIR.bit.GPIO17 = 0; // SPISOMIA 为输入 GPIO
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; //将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPAPUD.bit.GPIO18=0; //*启用 GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; //异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1; // SPICLKA 是一个输出 GPIO
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; //将 GPIO18配置为 SPICLKA
EDIS; //禁止对寄存器
SpiaRegs.SPICCR.bit.SPICHAR 的受保护访问 = 7; //选择8位字符输出(x + 1)
// KRA 编辑--我们将使用模式0 (Pol)、0 (Pha)--上升沿上的数据输出(无延迟)和上升沿上的样本数据
// KRA 编辑--针对00 pol / Pha 稳定-- 与串行闪存以及 MPS430G2553兼容的 POL/PhA 也被设定为0、0
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; //在上升沿
SpiaRegs.SPICTL.bit.CLK_PHASE 输入时、在下降时钟边沿上输出数据 = 0; //无延迟
SpiaRegs.SPICCR.bit.SPILBK 的正常 SPI 时钟方案 = 0; //禁用 SPI 环回模式
SpiaRegs.SPICTL.bit.master_slave = 0; // SPI 被配置为从器件,现在
SpiaRegs.SPICTL.bit.OVERRUNINTENA=0; //禁用接收器溢出标志位中断
SpiaRegs.SPICTL.bit.Talk = 1; //让 SPI 外设通信
SpiaRegs.SPIPRI.bit.free = 1; //仿真器断点不会干扰传输
// KRA 注释--可以通过更改 SYSCLKOUT (或90Mhz)的 LSPCLK 分频值来减慢 BRR 定义的波特率 通过将
LOSPCP 预分频器寄存器中的// LSPCLK 位更改为最大值7b、将4分频除以14、并在
//注意、LSPCLK 是驱动所有 SPI 和 SCI UART 器件进行波特率选择的基本时钟、必须采用这种方法 考虑
到//由于我们可以轻松地为 UART 生成9600波特的 SCI 时钟、在 LSPCLK 上除以4、但对于 SPI 为175K 位/秒
//速度"有点快"...我们将尽可能慢、但事实证明对于 G2553
//来说仍然太快了 90MHz/14 ~ 6.42MHz 的 LSPCLK 和(127+1)的 BITRATECONTROL 可产生50.22K 或~6278字节/秒
的 EALLOW 位速率;
CtrlRegs.LOSPP.ALL = 0x0007; //将 LSPCLK 的预分频器设置为12 (请参阅技术参考中的1.4.1.2)
(受保护寄存器) EDIS;
SpiaRegs.SPIBRR = BITRATECONTROL; //设置比特率
SpiaRegs.SPIFFTX.bit.SPIRST = 0; // SPI 发送和接收通道可以恢复
SpiaRegs.SPIFFTX.bit.SPIFFENA=1; //启用 SPI FIFO 增强
功能 SpiaRegs.SPIFFTX.bit.TXFIFO = 0; //清除 FIFO、复位指针、并保持在复位
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1; //清除 TXFIFINT 标志
SpiaRegs.SPIFFTX.bit.TXFFIL = 1; //设置为零
SpiaRegs.SPIFFTX.bit.TXFFIENA=0; //目前,禁用 TX FIFO 中断--等到 Rdy 发送
到 Xmit SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; //将 FIFO 复位为零并保持在 RESET
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; //清除任何挂起的中断
SpiaRegs.SPIFFRX.bit.RXFFIENA=1; //启用 RX FIFO 中断
SpiaRegs.SPIFFRX.bit.RXFFIL = 1; // FIFO 在接收
到的 SpiaRegs.SPIFFCT.bit.TXDLY=0时产生中断; //位的 FIFO 发送没有延迟;
SpiaRegs.SPIFFTX.bit.SPIRST = 1; // SPI 发送和接收通道可以恢复
SpiaRegs.SPICTL.bit.SPIINTENA=1; //启用 SPI 中断
SpiaRegs.SPICCR.bit.SPISWRESET = 1; //从 Reset
SpiaRegs.SPIFFTX.bit.TXFIFO 中撤回 SPI = 1; //为正常操作释放 FIFO
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; //释放 FIFO 以便使用
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用 PIE 块... 恰好在 PieCtrlRegs.PIEIER6.bit.INTx1
= 1的情况下; //启用 PIE 组6,INT 1
PieCtrlRegs.PIEIER6.bit.INTx2 = 1; //启用 PIE 组6,INT 2
IER |= M_INT6; // SPI block+
spiFlashData.currentCommand 的内核启用中断= flashNoOperation; //使 SPI 闪存状态机
spiFlashData.subState = 1; //预置为子状态1
spiFlashData.devicePresent = false; //预设、以便不存在器件
spiFlashData.commandComplete = false; //命令已完成,因为此时没有
pEventData->msp430Data.msgFail = NOTBUSY;
pEventData->msp430Data.lengthOfData = MAX_MSP430_string;
pEventData->msp430Data.MSP_WriteEventx = 0;psp430Data->msp430Data.Idx
= 0+;针对 MSP430的<MAX_I+=0+
pEventData->msp430Data.MSP430_ReadBuffer[i]= 0;
pEventData->msp430Data.MSP430_WriteBuffer[i]= 0;
}
对于(i = 0;i < FLASH_BUFSIZE;i++)
{
tempMspWrBuffer[i]= tempMspRdBuffer[i]= 0;
}
tmpMspRdIdx = tmpMspWrIdx = 0;
pEventData->SPI_Port_Busy = port_flash_Busy;
spiPort.rxCharCount = tspiPort.txWriteIndex = 0+
spiPort.checkCount
;<ePort = 0+= rspiReadSpiWriteIndex = 0+;<= 0+= rspiReadPort.SpiReadSpiReadPort.SpiSpiSpiPort = 0+;<= 0+= 0+= rspiReadSpiReadSpiReadSpiReadSpiPort =
spiPort.rxBuffer [i]= 0;
spiPort.txBuffer [i]= 0;
}
do _a_nop;
返回;
} // init_hal_spi_flash
__interrupt void spiaFlashTransmitIsr (void)
{//
静态无符号 int 延迟;
unsigned char tempData; //临时数据变量
if (pEventData->SPI_Port_BUSY =PORT_MSP430_BUSY)
{
if (pEventData->msp430Data.MSP_WriteIdx > MAX_MSP430_string)
{
pEventData->msp430Data.MSP_WriteIdx = 0; //将缓冲区指针打包
}
if (pEventData->msp430Data.xmitcnt!= 0)
{
tempData = pEventData->msp430Data.MSP430_WriteBuffer[pEventData->msp430Data.MSP_WriteIdx+]; //字符写入
if (tmpMspWrIdx > FLASH_BUFSIZE)
{
tmpMspWrIdx = 0;
}
tempMspWrBuffer[tmpMspWrIdx++]= tempData; //无条件保存从写入缓冲区中拉出/发送的每个 Tx 字符
tempData <<= 8; //将其向左移动
tempData &= 0xFF00; //关闭掩码无关
// 对于(delay = 0;delay < 8000;delay++){}; //等待一段时间
SpiaRegs.SPITXBUF = tempData; //将数据载入发送寄存器
pEventData->msp430Data.xmitcnt --; //减量计数,0时停止;
}
其他
{
SPI_TX_INT_DISABLE; //停止发送新字符
// MSP430_CE_DISABLE; //需要等待 FIFO 清除
}
}
// KRA edit --下面的代码只用于串行闪存操作!!! 此 ISR 结束后、MSP430和串行闪存的接收 ISR 会跟随
否则(pEventData->SPI_Port_BUSY =PORT_FLASH_BUSY)
{
IF (SpiaRegs.SPIFFTX.bit.TXFFST < 1) //确保 FIFO 中有空间(只有四个位置)
{
if (spiPort.txCharCount) //确定,缓冲区中是否还有字符...
{
tempData = spiPort.txBuffer [spiPort.txReadIndex++]; //是,加载数据,使左对齐并包括索引
tempData <<= 8; //将其向左移动
tempData &= 0xFF00;
SpiaRegs.SPITXBUF = tempData; //将数据载入发送寄存器
spiPort.txCharCount--; //字符已发送,因此计数递减
if (spiPort.txReadIndex >= FLASH_BUFSIZE) //检查我们是否在循环缓冲区的末尾...
{
spiPort.txReadIndex = 0; //重置索引(如果是)
} //缓冲区结束检查
}
else //确定,不剩余字符... //如果没有要发送的字符...
{
SPI_TX_INT_DISABLE; //关闭 TX 中断
} //缓冲区检查结束
} // FIFO 结束完全检查
}
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1; //清除中断标志
PieCtrlRegs.PIEACK.bit.ACK6 = 1; //发出 PIE 确认
} //结束_interrupt void spiFlashTransmitIsr
__interrupt void spiaFlashReceiveIsr (void)
{
静态无符号 int 错误计数= 0; //将其设置为0以启动
unsigned char tempData; //读取数据临时数据变量
tempData = SpiaRegs.SPIRXBUF;
//无符号字符 tempMspWrBuffer[FLASH_BUFSIZE*2]、tempMspRdBuffer[FLASH_BUFSIZE*2];
//无符号 int tmpMspRdIdx = 0;
if (pEventData->SPI_Port_BUSY =PORT_MSP430_BUSY)
{
if (tmpMspRdIdx > flash_BUFSIZE)
{
tmpMspRdIdx = 0;
}
tempMspRdBuffer[tmpMspRdIdx++]= tempData; //无条件保存循环缓冲区中的每个接收字符
if (pEventData->msp430Data.msgFail == BUSYREAD) //这可能是写入期间的伪读取:chk 表示 SYN char @else
{
if (pEventData->msp430Data.MSP_ReadIdx =0) //我们是否正在等待 STX?
{
if (tempData == STX)
{
pEventData->msp430Data.MSP430_ReadBuffer[pEventData->msp430Data.MSP_ReadIdx+]= tempData;
}
否则、如果(tempData == SYN)//否、字符不是 STX...IDLE 字符?
{
//好的,假设我们一直在进行正确的通信--继续,但只针对如此多的字符...
if (errorcount++> MAX_MSP_RCVCHAR_ERR)
{
//好的,我们已经等了4毫秒才开始 response...it
Process_MSP_Rcv_error();
}
}
其他 //没有 STX 或 SYN 字符,读取计数仍为0...报告错误
{
//好的,不是 STX 或 SYN 同步字符——我们真的不是序列
Process_MSP_Rcv_error();
}
}
else //确定、我们有一个 STX 或者 IDX 仍然为0、检查 ETX 和填充字符
{
if (pEventData->msp430Data.MSP_ReadIdx < MAX_MSP430_string)
{
pEventData->msp430Data.MSP430_ReadBuffer[pEventData->msp430Data.MSP_ReadIdx+]= tempData;
if (tempData == ETX)
{
//好的,我们已经用缓冲区小于满的 ETX 终止,所以报告 OK,BUSYREAD 的末尾
pEventData->msp430Data.msgFail =确定;
pEventData->msp430Data.lengthOfData = pEventData->msp430Data.MSP_ReadIdx;// IDX 是字符计数
pEventData->msp430Data.MSP_ReadIdx = 0; //清除下一个 RCV 的读 idx
pEventData->msp430Data.MSP_WriteIdx = 0; //清除下一个 RCV 的写入 idx
//关闭 SPI 发送中断以关闭接收! 我们只是为了阅读字符而再次接受我们的支持!
SPI_TX_INT_DISABLE;
}
}
else //我们已填充接收缓冲区...rcv 错误
{
Process_MSP_Rcv_error();
}
}
do _a_nop;
}
否则(pEventData->msp430Data.msgFail == BUSYWRITE) // substate 应该= BUSYWRITE、因此应处理写入返回字节
{
if ( tempData != SYN ) //跳过此字符--垃圾,不需要保存或阅读“em”
{
// _asm (" ESTOP0"); //出于调试目的取消注释//未按预期工作...research
}
}
否则//我们不在 BUSYREAD 或 BUSYWRITE 中,我们不应该在 PORT_MSP430_BUSY 模式中!
{
//我们确实处于“丢失”的区域,因此总结了一个错误
_asm (" ESTOP0"); //取消注释以进行调试 //未按预期工作...研究
}
}
// KRA edit --下面的代码只用于串行闪存操作!!!
否则(pEventData->SPI_Port_BUSY =PORT_FLASH_BUSY) //如果我们不是闪存忙,请清除中断
{ //并返回
if (tmpFlashRdIdx > flash_BUFSIZE)
{
tmpFlashRdIdx = 0;
}
tempFlashRdBuffer[tmpFlashRdIdx++]= tempData; //无条件保存循环缓冲区中的每个接收字符
if (spiPort.rxCharCount < FLASH_BUFSIZE) //确保我们有空间,否则报告错误
{
spiPort.rxBuffer [spiPort.rxWriteIndex++]= tempData; //存储接收字节并递增接收索引
if (spiPort.rxWriteIndex >= FLASH_BUFSIZE) //检查我们是否在循环缓冲区的末尾...
{
spiPort.rxWriteIndex = 0; //重置索引(如果是)
} //缓冲区检查结束
spiPort.rxCharCount++; //字符已接收,因此增加计数
}
其他 //报告 SPI 闪存错误
{
pEventData->SPI_Port_Busy = PORT_FLASH_ERR; //报告 RCVERR
spiPort.rxCharCount = 0; //设置新的闪存接收
spiPort.rxWriteIndex = 0; // ditto
spiPort.rxReadIndex = 0; // ditto
SPI_TX_INT_DISABLE; //停止填料
}
}
else //哎呀! MSP 或闪存都不忙! 在缓冲区中填充字符以进行调试...
{
if (tmpFlashRdIdx > flash_BUFSIZE)
{
tmpFlashRdIdx = 0;
}
tempFlashRdBuffer[tmpFlashRdIdx++]= tempData; //无条件保存循环缓冲区中的每个接收字符
spiPort.rxCharCount = 0; //设置新的闪存接收
spiPort.rxWriteIndex = 0; // ditto
spiPort.rxReadIndex = 0; // ditto
SPI_TX_INT_DISABLE; //停止填料
_asm (" ESTOP0"); //未按预期工作...研究
}
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1; //清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; //清除中断标志
PieCtrlRegs.PIEACK.bit.ACK6 = 1; //发出 PIE 确认
}//_中断结束 void spiFlashReceiveIsr
void process_MSP_Rcv_error (void)
{
//确定,清除接收--0 out IDX'es,报告失败 msgFail
pEventData->msp430Data.MSP_ReadIdx = 0; //清除读 idx
pEventData->msp430Data.MSP_WriteIdx = 0; //清除写入 idx
pEventData->msp430Data.msgFail =失败;
//最好关闭 SPI 发送中断以关闭接收!
SPI_TX_INT_DISABLE;
}
#endif