|
SPI总线没有提供忙标志线,一般设备SPI总线都提供一个状态寄存器来进行判断,也可以产生中断,要注意的是,看这个标志位是否是硬件清除的还是软件清除的,如果是软件清除,读完后要把它清除掉。
示例代码,用于LPC2148上的SPI总线。
- /**********************************************************/
- /* 函数名称 : SPI_Init */
- /* 函数功能 : 初始化SPI接口,设置为主机。 */
- /* 参数 : 无 */
- /* 返回值 : 无 */
- /*--------------------------------------------------------*/
- void SPI_Init(void)
- {
- #if SPI_EN > 0
-
- PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; //选择 SPI
-
- S0SPCR = (0x00 << 3) | // CPHA = 0,
- (0x00 << 4) | // CPOL = 0,
- (0x01 << 5) | // MSTR = 1,SPI 处于主模式
- (0x00 << 6) | // LSBF = 0,SPI据传输MSB(bit7)在先
- (0x00 << 7); // SPIE = 0,SPI中断禁止
-
- S0SPCCR = 8; //SPI 时钟预分频(PCLK/8)
-
- #else
-
- IODIR0 |= SCLK | MOSI ;
- IODIR0 &= (~ MISO);
-
- #endif
- }
- /**********************************************************/
- /* 函数名称 : SPI_SendData */
- /* 函数功能 : 通过SPI发送一个字节的数据并接收一字节 */
- /* 参数 : 待发送的字节数据 */
- /* 返回值 : 接收到的数据 */
- /*--------------------------------------------------------*/
- INT8U SPI_SendData(INT8U data)
- {
- #if SPI_EN == 0 //IO模拟方式
-
- INT8U i,j,temp,rev_data;
-
- temp = data;
- for(i = 0; i <= 7; i++)
- {
- IO0SET |= SCLK;
- if(temp & 0x80)
- IO0SET |= MOSI;
- else
- IO0CLR |= MOSI;
- rev_data <<=1;
- if(IO0PIN & MISO)
- rev_data |= 0x01;
- else
- rev_data &= 0xFE;
- for(j=8;j>0;j--);
- IO0CLR |= SCLK;
- for(j=8;j>0;j--);
- temp <<= 1;
- }
- IO0SET |= SCLK;
- return(rev_data) ;
-
- #else
-
- S0SPDR = data;
- while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
- return(S0SPDR);
-
- #endif
- }
复制代码 |
|