📄 spi.c
字号:
#include <stdio.h>
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>
#define N 10
extern void VECSTART(void);
MCBSP_Config ConfigLoopBack32= {
MCBSP_SPCR1_RMK(
1, /* DLB = 1 数字循环模式*/
0, /* RJUST = 0 */
2, /* CLKSTP = 0 SPI模式*/
0, /* DXENA = 0 */
0, /* ABIS = 0 */
0, /* RINTM = 0 */
0, /* RSYNCER= 0 */
0, /* RFULL = 0 N/A */
0, /* RRDY = 0 N/A */
0 /* RRST = 0 */
),
MCBSP_SPCR2_RMK(
0, /* FREE = 0 */
0, /* SOFT = 0 */
0, /* FRST = 0 */
0, /* GRST = 0 */
0, /* XINTM = 0 */
0, /* XSYNCER= N/A */
0, /* XEMPTY = N/A */
0, /* XRDY = N/A */
0 /* XRST = 0 */
),
MCBSP_RCR1_RMK(
1, /* RFRLEN1 = 0 每帧2字*/
2 /* RWDLEN1 = 2 每字16bit*/
),
MCBSP_RCR2_RMK(
0, /* RPHASE = 0 单相帧*/
0, /* RFRLEN2 = 0 */
0, /* RWDLEN2 = 0 */
0, /* RCOMPAND= 0 */
0, /* RFIG = 0 */
1 /* RDATDLY = 0 SPI主模式需要1bit延迟 */
),
MCBSP_XCR1_RMK(
1, /* XFRLEN1 = 0 每帧2字*/
2 /* XWDLEN1 = 2 每帧2字*/
),
MCBSP_XCR2_RMK(
0, /* XPHASE = 0 单相帧*/
0, /* XFRLEN2 = 0 */
0, /* XWDLEN2 = 0 */
0, /* XCOMPAND= 0 */
0, /* XFIG = 0 */
1 /* XDATDLY = 0 SPI主模式需要1bit延迟*/
),
MCBSP_SRGR1_RMK(
39, /* FWID = 1 FWID=40CLKG同步信号为低电平,持续时间为40个时钟周期*/
35 /* CLKGDV = 1 CLKG=4MHZ*/
),
MCBSP_SRGR2_RMK(
0, /* FREE = 0 */
0, /* CLKSP = 0 */
1, /* CLKSM = 1 */
0, /* FSGM = 0 */
47 /* FPER = 0 FPER=48CLKG帧周期为48个时钟周期,低40个,高8个*/
),
0x0000,//MCBSP_MCR1_DEFAULT,
0x0000,//MCBSP_MCR2_DEFAULT,
MCBSP_PCR_RMK(
0, /* IDLEEN = 0 */
0, /* XIOEN = 0 */
0, /* RIOEN = 0 */
1, /* FSXM = 1 */
0, /* FSRM = 0 */
0, /* SCLKME = 0 */
0, /* CLKSSTAT = N/A */
0, /* DXSTAT = N/A */
0, /* DRSTAT = N/A */
1, /* CLKXM = 1 */
0, /* CLKRM = 0 */
1, /* FSXP = 0 发送帧同步低有效*/
1, /* FSRP = 0 接收帧同步低有效 */
0, /* CLKXP = 0 */
0 /* CLKRP = 0 */
),
0x0000,//MCBSP_RCERA_DEFAULT
0x0000,//MCBSP_RCERB_DEFAULT
0x0000,//MCBSP_RCERC_DEFAULT
0x0000,//MCBSP_RCERD_DEFAULT
0x0000,//MCBSP_RCERE_DEFAULT
0x0000,//MCBSP_RCERF_DEFAULT
0x0000,//MCBSP_RCERG_DEFAULT
0x0000,//MCBSP_RCERH_DEFAULT
0x0000,//MCBSP_XCERA_DEFAULT
0x0000,//MCBSP_XCERB_DEFAULT
0x0000,//MCBSP_XCERC_DEFAULT
0x0000,//MCBSP_XCERD_DEFAULT
0x0000,//MCBSP_XCERE_DEFAULT
0x0000,//MCBSP_XCERF_DEFAULT
0x0000,//MCBSP_XCERG_DEFAULT
0x0000,//MCBSP_XCERH_DEFAULT
};
/* Define a MCBSP_Handle object to be used with MCBSP_open function */
MCBSP_Handle mhMcbsp;
Uint32 xmt[N], rcv[N];
volatile Uint16 XfrCnt = 0;
Uint16 err = 0;
Uint16 old_intm;
Uint16 rcvEventId, xmtEventId;
// Interrupt Service Routine Prototypes
interrupt void writeIsr(void);
interrupt void readIsr(void);
void taskFxn(void);
void main(void)
{
Uint16 i;
/* Initialize CSL library - This is REQUIRED !!! */
CSL_init();
/* Set IVPD/IVPH to start of interrupt vector location */
IRQ_setVecs((Uint32)(&VECSTART));
for (i = 0; i <= N - 1; i++) {
xmt[i] = i;
rcv[i] = 0;
}
/* Call function to effect transfer */
taskFxn();
}
void taskFxn(void)
{
Uint16 i;
old_intm = IRQ_globalDisable();
/* Open MCBSP Port 1 and set registers to their power on defaults */
mhMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
/* Get EventId's associated with MCBSP Port 0 receive and transmit */
/* The event Id's are used to communicate with the CSL interrupt */
/* module functions. */
rcvEventId = MCBSP_getRcvEventId(mhMcbsp);
xmtEventId = MCBSP_getXmtEventId(mhMcbsp);
/* Clear any pending receive or transmit interrupts */
IRQ_clear(rcvEventId);
IRQ_clear(xmtEventId);
/* Place address of interrupt service routines at */
/* associated vector location */
IRQ_plug(rcvEventId, &readIsr);
IRQ_plug(xmtEventId, &writeIsr);
/* Write values from configuration structure to MCBSP control regs */
MCBSP_config(mhMcbsp, &ConfigLoopBack32);
/* Enable the MCBSP receive and transmit interrupts */
IRQ_enable(rcvEventId);
IRQ_enable(xmtEventId);
/* Enable MCBSP transmit and receive */
MCBSP_start(mhMcbsp,
MCBSP_RCV_START | MCBSP_XMIT_START,
0
);
/* Prime MCBSP transmit */
while(!MCBSP_xrdy(mhMcbsp)){
;
}
MCBSP_write16(mhMcbsp,xmt[XfrCnt]);
/* Enable all masked interrupts */
IRQ_globalEnable();
/* Start Sample Rate Generator and Frame Sync */
MCBSP_start(mhMcbsp,
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
0x300
);
/* Wait for transfer of data */
while (XfrCnt < 10) {
;
}
/*------------------------------------------*\
* Compare values
\*------------------------------------------*/
for(i = 0; i <= N - 1; i++){
if (rcv[i] != xmt[i]){
++err;
break;
}
}
if (err) {
printf(" :-< MCBSP Example 1 Failed >-:\n");
}
else {
printf(" :-> MCBSP Example 1 Successful <-:\n");
}
/* Restore old value of INTM */
IRQ_globalRestore(old_intm);
/* We're done with MCBSP, so close it */
MCBSP_close(mhMcbsp);
}
interrupt void writeIsr(void)
{
IRQ_disable(xmtEventId);
MCBSP_write16(mhMcbsp,xmt[XfrCnt]);
}
interrupt void readIsr(void)
{
rcv[XfrCnt] = MCBSP_read16(mhMcbsp);
++XfrCnt;
if (XfrCnt == N) {
IRQ_disable(rcvEventId);
IRQ_disable(xmtEventId);
MCBSP_reset(mhMcbsp);
}
else {
IRQ_enable(xmtEventId);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -