?? spi.c
字號:
#include "spi.h"
uint8_t dis_buffer[4]={1,2,3,4};
uint8_t rcv_data;
uint8_t DISP_TAB[19] = {
// 0 1 2 3 4 5 6 7 8 9
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
// A b C d E F
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,
// L P C
0xC7, 0x8C,0xC6 };
OS_EVENT *Sem1; // 定義一個信號量
void task_spi(void *pdata)
{
uint8_t position=0;
uint8_t i=0;
uint8 err;
pdata = pdata; // 避免編譯警告
MSPI_Init(); // 初始化SPI接口
while(1)
{
OSSemPend(Sem1, 0, &err); //等待信號量
for(i=0;i<5;i++)
{
IOSET1|=(0x0f<<DIS1);
rcv_data = MSPI_SendData((uint16_t)(DISP_TAB[dis_buffer[position]])); // 發送顯示數據
IOCLR1|=(1<<(DIS1+position++)) ;
if(position>3) position=0;
Delay1us(10); // 延時
}
}
}
void MSPI_Init(void)
{
PINSEL0 = 0x00001500; // 設置SPI管腳連接
PINSEL0 &=~(3<<14);
IODIR0|=(uint32_t)(1<<nDSEN);
PINSEL2&=~(1<<3);
IODIR1|=(0x0f<<DIS1);
IOSET1|=(0x0f<<DIS1);
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 設置管腳連接SPI
//PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
S0SPCCR = 0x52; // 設置SPI時鐘分頻
S0SPCR = (0 << 3) | // CPHA = 0, 數據在SCK 的第一個時鐘沿采樣
(1 << 4) | // CPOL = 1, SCK 為低有效
(1 << 5) | // MSTR = 1, SPI 處于主模式
(0 << 6) | // LSBF = 0, SPI 數據傳輸MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中斷被禁止
}
uint8_t MSPI_SendData(uint16_t data)
{
IOCLR0 |= (uint32_t)(1<<nDSEN) ; // 片選74HC595
S0SPDR = data;
while( 0 == (S0SPSR & 0x80)); // 等待SPIF置位,即等待數據發送完畢
IOSET0|=(uint32_t)(1<<nDSEN);
return(S0SPDR);
}
void Delay1us(uint32_t times)
{
uint8_t i=0;
uint32_t j=0;
for(j=0; j<times; j++)
{
for(i=0; i<60; i++);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -