CSIH.c 7.92 KB
Newer Older
hu's avatar
hu committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
#include "r_typedefs.h"
#include "dr7f701441.dvf.h"
#include  "CSIH.h"
#include  "GPIO.h"



void INTCSIH0IC(void);
void INTCSIH0IR(void);
void INTCSIH1IC(void);
void INTCSIH1IR(void);



/*  释放CPU回调,用于降低功耗 或 操作系统调度  */
static void CSIH_CPU_SleepIdle(void)
{
//    WDT_Clear();   /*  阻塞发送时,防止看门狗复位  */
}

/*  将MFS初始化成SPI的只发送模式  */
/*  参数 channel 为通道号:0 到 1  */
/*  参数 baud 为波特率,即你的SPI的SCK的频率 单位:K */
/*  参数 bitnum 为data数据的bit位数  */
/*  参数 sck_edge 为SCK时钟信号的格式 CSIH_SCKH_Rising,  在时钟信号空闲时,为高电平, 上升沿取数
                                    CSIH_SCKH_Falling, 在时钟信号空闲时,为高电平, 下降沿取数  
                                    CSIH_SCKL_Rising,  在时钟信号空闲时,为低电平, 上升沿取数  
                                    CSIH_SCKL_Falling, 在时钟信号空闲时,为低电平, 下降沿取数  */
/*  参数 dat_format 为MOSI信号的发送数据的格式 CSIH_DAT_LSbit 表示低位先发出
                                        	 CSIH_DAT_MSbit表示高位先发出 */
void CSIH_Init(uint8_t channel, 
                   uint16_t baud,
				   uint8_t bitnum,
                   CSIH_SCK_Edge sck_edge, 
                   CSIH_DAT_FORMAT dat_format
                   )
{  
    if(channel > 1U)
    {	
    }
    else
    {	
	CSIH[channel]->unCTL0.u8Register  = 0x00U;
	CSIH[channel]->unCTL1.u32Register = 0x00020000UL;

	if(channel == 1U)
	{
	    CSIH[channel]->unCTL2.stcField.CSIHnPRS = 0U;
	    
	    switch(baud)		
	    {
		case 1000:
		    CSIH[channel]->unCTL2.stcField.CSIHnBRS    = 4U;
		    CSIH[channel]->unCFG0.stcField.PSCLxOBRSSx = 0U;
		    break;
		case 500:
		    CSIH[channel]->unCTL2.stcField.CSIHnBRS    = 8U;
		    CSIH[channel]->unCFG0.stcField.PSCLxOBRSSx = 0U;
		    break;
		case 250:
		    CSIH[channel]->unCTL2.stcField.CSIHnBRS    = 16U;
		    CSIH[channel]->unCFG0.stcField.PSCLxOBRSSx = 0U;
		    break;
		case 100:
		    CSIH[channel]->unCTL2.stcField.CSIHnBRS    = 40U;
		    CSIH[channel]->unCFG0.stcField.PSCLxOBRSSx = 0U;
		    break;
		default:
		    break;
	    }
	}
	else
	{
	    switch(baud)		
	    {
		case 1000:
		    CSIH[channel]->unCTL2.stcField.CSIHnPRS = 1U;
		    CSIH[channel]->unBRS0.stcField.CSIHnBRS = 2U;
		    break;
		case 500:
		    CSIH[channel]->unCTL2.stcField.CSIHnPRS = 1U;
		    CSIH[channel]->unBRS0.stcField.CSIHnBRS = 4U;
		    break;
		case 250:
		    CSIH[channel]->unCTL2.stcField.CSIHnPRS = 1U;
		    CSIH[channel]->unBRS0.stcField.CSIHnBRS = 8U;
		    break;
		case 100:
		    CSIH[channel]->unCTL2.stcField.CSIHnPRS = 1U;
		    CSIH[channel]->unBRS0.stcField.CSIHnBRS = 20U;
		    break;
		default:
		    break;
	    }

	    CSIH[channel]->unCFG0.stcField.PSCLxOBRSSx = 0U;
	}

	CSIH[channel]->unMCTL0.u16Register = 0x0100U;
	CSIH[channel]->unSTCR0.u16Register = 0x010BU;

	CSIH[channel]->unCFG0.stcField.CSIHnPSx  = 0U;
	CSIH[channel]->unCFG0.stcField.CSIHnDLSx = bitnum;
	CSIH[channel]->unCFG0.stcField.CSIHnRCBx = 0U;

	if(dat_format == CSIH_DAT_LSbit )				
	{
	    CSIH[channel]->unCFG0.stcField.CSIHnDIRx = 1U;	
	}
	else
	{
	    CSIH[channel]->unCFG0.stcField.CSIHnDIRx = 0U;
	}

	switch(sck_edge)
	{
	    case CSIH_SCKH_Rising :
		CSIH[channel]->unCFG0.stcField.CSIHnCKPx = 0U;
		CSIH[channel]->unCFG0.stcField.CSIHnDAPx = 0U;
		break;
	    case CSIH_SCKH_Falling :
		CSIH[channel]->unCFG0.stcField.CSIHnCKPx = 0U;
		CSIH[channel]->unCFG0.stcField.CSIHnDAPx = 1U;
		break;
	    case CSIH_SCKL_Rising :
		CSIH[channel]->unCFG0.stcField.CSIHnCKPx = 1U;
		CSIH[channel]->unCFG0.stcField.CSIHnDAPx = 1U;
		break;
	    case CSIH_SCKL_Falling :
		CSIH[channel]->unCFG0.stcField.CSIHnCKPx = 1U;
		CSIH[channel]->unCFG0.stcField.CSIHnDAPx = 0U;
		break;
	    default:
		break;		
	}

	CSIH[channel]->unCFG0.stcField.CSIHnIDLx = 0U;
	CSIH[channel]->unCFG0.stcField.CSIHnIDx  = 0U;
	CSIH[channel]->unCFG0.stcField.CSIHnHDx  = 0U;
	CSIH[channel]->unCFG0.stcField.CSIHnINx  = 0U;
	CSIH[channel]->unCFG0.stcField.CSIHnSPx  = 0U;
	
	CSIH[channel]->unCTL0.u8Register  |= 0xE0U;
	

	switch(channel)
        {
            case 0:
			PBGFSGD0BPROT0 = 0x07FFFFFFUL;
			INTC2EIC78     = 0x0047UL;
			INTC2EIC79     = 0x0047UL;
			break;
            case 1:
			PBGFSGD0BPROT0 = 0x07FFFFFFUL;
			INTC2EIC137    = 0x0047UL;
			INTC2EIC138    = 0x0047UL;
			break;
            default:
		    break;
        }

    }
       
}

/*  获取发送的忙状态,即发送是忙着呢吗?  */
/*  参数 channel 为通道号:0 到 1  */
/*  返回值:MFS_SPI_OptSt_OK=发送空闲, MFS_SPI_OptSt_BUSY=发送忙中*/
static CSIH_OptSt CSIH_IsSendBusy(uint8_t channel)
{
    CSIH_OptSt re_value = CSIH_OptSt_BUSY;
    
    if(channel > 1U)
    {
        re_value = CSIH_OptSt_BUSY;
    }
    else
    {
        if(CSIH[channel]->unSTR0.stcField.CSIHnTSF == 1U)
        {
            re_value = CSIH_OptSt_BUSY;
        }
        else
        {
            re_value = CSIH_OptSt_OK;
        }
    }  

    return re_value;
}

/*  阻塞等待发送忙完,即发送准备好了  */
/*  参数 channel 为通道号:0 到 1 */
static void CSIH_WaitForSendReady(uint8_t channel)
{    
    while(CSIH[channel]->unSTR0.stcField.CSIHnTSF == 1U)
    {
        CSIH_CPU_SleepIdle();  /*  释放CPU  */
    }
}


/*  发送数据,采12bit对齐,2个数据块的方式  */
/*  参数 channel 为通道号:0 到 1  */
/*  返回值:CSIH_OptSt_OK=发送成功, CSIH_OptSt_BUSY=发送忙中*/
CSIH_OptSt CSIH_SendData_12bit8th(uint8_t channel, uint16_t* pdat)
{
    uint8_t i;
    
    CSIH_OptSt re_value = CSIH_OptSt_BUSY;
    
    if(channel > 1U)
    {
        re_value = CSIH_OptSt_BUSY;
    }
    else
    {
	CSIH_WaitForSendReady(channel);
	CSIH[channel]->unMCTL2.u32Register &= 0x7FFFFFFFUL;
	CSIH[channel]->unMRWP0.u32Register &= 0xFFFFFF80UL;
	
#ifdef TLC6C5912
	CSIH[channel]->unMCTL2.u32Register = (0x00000010UL | (TLC6C5912_TOTAL_CHIP_NUM << 16U));
#else
	CSIH[channel]->unMCTL2.u32Register  = 0x00080010UL;
#endif

#ifdef TLC6C5912
	for(i=0U;i<TLC6C5912_TOTAL_CHIP_NUM;i++)
	{
	    CSIH[channel]->unTX0W.u32Register = (0x00FE0000UL | pdat[i]);
	}
#else
	for(i=0U;i<8U;i++)
	{
	    CSIH[channel]->unTX0W.u32Register = (0x00FE0000UL | pdat[i]);
	}
#endif

	CSIH[channel]->unMCTL2.u32Register |= 0x80000000UL;
	
        re_value = CSIH_OptSt_OK;
    }  
    
    return re_value;
}

/*  发送数据,采9bit对齐,1个数据块的方式  */
/*  参数 channel 为通道号:0 到 1  */
/*  返回值:CSIH_OptSt_OK=发送成功, CSIH_OptSt_BUSY=发送忙中*/
CSIH_OptSt CSIH_SendData_9bit1th(uint8_t channel, uint16_t* pdat)
{
    uint8_t i;
    
    CSIH_OptSt re_value = CSIH_OptSt_BUSY;
    
    if(channel > 1U)
    {
        re_value = CSIH_OptSt_BUSY;
    }
    else
    {
	CSIH_WaitForSendReady(channel);
	CSIH[channel]->unMCTL2.u32Register &= 0x7FFFFFFFUL;
	CSIH[channel]->unMRWP0.u32Register &= 0xFFFFFF80UL;
	CSIH[channel]->unMCTL2.u32Register  = 0x00010010UL;

	for(i=0U;i<1U;i++)
	{
	    CSIH[channel]->unTX0W.u32Register = (0x00FE0000UL | pdat[i]);
	}

	CSIH[channel]->unMCTL2.u32Register |= 0x80000000UL;
	
        re_value = CSIH_OptSt_OK;
    }  
    
    return re_value;
}


void CSIH_Ch0_Rx_ISR(void)/* CSIH0 Reception Status interrupt INTCSIH0IR */
{
    uint32_t data;

    data = CSIH[0]->unRX0H.u16Register;
    
    PBGFSGD0BPROT0 = 0x07FFFFFFUL;
    INTC2EIC78   &= 0xEFFFU; 
}  

void CSIH_Ch1_Rx_ISR(void)	/* CSIH1 Reception Status interrupt INTCSIH1IR */
{
    uint32_t data;

    data = CSIH[1]->unRX0H.u16Register;
    
    PBGFSGD0BPROT0 = 0x07FFFFFFUL;
    INTC2EIC137   &= 0xEFFFU; 
}  


void CSIH_Ch0_Tx_ISR(void)	/* CSIH0 Communication Status interrupt INTCSIH0IC*/
{     
    PBGFSGD0BPROT0 = 0x07FFFFFFUL;
    INTC2EIC79   &= 0xEFFFU; 
	/* storage */
	//TLC6C5912_nCS = 1U;
}  

void CSIH_Ch1_Tx_ISR(void)	/* CSIH1 Communication Status interrupt INTCSIH1IC*/
{     
    PBGFSGD0BPROT0 = 0x07FFFFFFUL;
    INTC2EIC138   &= 0xEFFFU; 
}