unsigned char SPI_TxFrame(unsigned char *pBuffer, unsigned int size) { if(size ==0 ) return (1); if(UCA0STAT & UCBUSY) return (0); _disable_interrupts(); SPI_Rx_Or_Tx = 1; SPI_Tx_Buffer = pBuffer; SPI_Tx_Size = size - 1; SPI_Interrupt_Sel(SPI_Rx_Or_Tx); //__enable_interrupt(); UCA0IFG &= ~(UCTXIFG + UCRXIFG); __bis_SR_register(GIE); UCA0TXBUF = *SPI_Tx_Buffer; _bis_SR_register(LPM0_bits); // unsigned int gie = _get_SR_register() & GIE; // // while(size--) // { // while( !(IFG2 & UCA0TXIFG) ); // UCA0TXBUF = *pBuffer++; // } // while(UCA0STAT & UCBUSY); // UCA0RXBUF; // _bis_SR_register(gie); return (1); }
unsigned char SPI_RxFrame(unsigned char *pBuffer, unsigned int size) { if(size ==0 ) return (1); if(UCA0STAT & UCBUSY) return (0); _disable_interrupts(); SPI_Rx_Or_Tx = 0; SPI_Rx_Buffer = pBuffer; SPI_Rx_Size = size - 1; SPI_Interrupt_Sel(SPI_Rx_Or_Tx); _enable_interrupts(); UCA0TXBUF = 0xff; //在接收模式下,也先发送一次空字节,一遍提供时钟通信 _bis_SR_register(LPM0_bits); // unsigned int gie = _get_SR_register() & GIE; // IFG2 &= ~UCA0RXIFG; // // while(size--) // { // while( !(IFG2 & UCA0TXIFG) ); // UCA0TXBUF = 0xff; // while( !(IFG2 & UCA0RXIFG) ); // *pBuffer++ = UCA0RXBUF; // } return 1; }
/**************************************************************************** * 名 称:SPI_TxFrame() * 功 能:3线硬件SPI模式下,发送指定数目的字节缓存 * 入口参数:pBuffer:指向待发送的数组地址 * size:待发送的字节数 * 出口参数:0:当前硬件SPI在忙, * 1:当前数据已发送完毕, * 说 明:使用该函数可以发送指定个数的一帧数据 * 使用范例:SPI_TxFrame(CMD,6); // 从CMD中取出并发送6个字节 ****************************************************************************/ unsigned char SPI_TxFrame(unsigned char *pBuffer, unsigned int size) { if(size==0) return (1); if(UCB0STAT & UCBUSY) return (0); // 判断硬件SPI正忙,返回0 _disable_interrupts(); // 关闭总中断 SPI_Rx_Or_Tx = 1; // 开启发送模式 SPI_Tx_Buffer = pBuffer; // 将发送缓存指向待发送的数组地址 SPI_Tx_Size = size-1; // 待发送的数据个数 SPI_Interrupt_Sel(SPI_Rx_Or_Tx); // SPI中断开启选择 _enable_interrupts(); // 开总中断 UCB0TXBUF = *SPI_Tx_Buffer; // 先发送第一个字节人工触发第一次"发送"中断 _bis_SR_register(LPM0_bits); // 进入低功耗模式0 //flagTx = 1; //while(flagTx); return (1); }
/**************************************************************************** * 名 称:SPI_RxFrame() * 功 能:3线硬件SPI模式下,接收指定数目的字节 * 入口参数:pBuffer:指向存放接收数据的数组 * size:要接收的字节数 * 出口参数:0:当前硬件SPI在忙, * 1:当前数据已发送完毕, * 说 明:使用该函数可以接收指定个数的一帧数据 * 使用范例:SPI_RxFrame(CMD,6);// 接收6个字节,并依次放入CMD中 ****************************************************************************/ unsigned char SPI_RxFrame(unsigned char *pBuffer, unsigned int size) { if(size==0) return (1); if(UCB0STAT & UCBUSY) return (0); // 判断硬件SPI正忙,返回0 _disable_interrupts(); // 关闭总中断 SPI_Rx_Or_Tx = 0; // 开启接收模式 SPI_Rx_Buffer = pBuffer; // 将发送缓存指向待发送的数组地址 SPI_Rx_Size = size-1; // 待发送的数据个数 SPI_Interrupt_Sel(SPI_Rx_Or_Tx); // SPI中断开启选择 // 开总中断 UCB0TXBUF = 0xFF; // 在接收模式下,也要先发送一次空字节,以便提供通信时钟。 IFG2 |= UCB0RXIFG; _enable_interrupts(); //flagRx = 1; // 进入低功耗模式0 //while(flagRx); _bis_SR_register(LPM0_bits); return (1); }