您好!
我使用 的是 具有串行接口的 MCP23S08 8位 I/O 扩展器。
我想用 SPI Microchip "MCP23S08"刷写 LED。
我的 C 代码:
#include #define MCP_IODIR 0x00 #define MCP_IPOL 0x01 #define MCP_GPINTEN 0x02 #define MCP_DEFVAL 0x03 #define MCP_INTMCP 0x04 #define MCP_IOMCP 0x05 #define MCP_GPPU 0x06 #define MCP_INTF 0x07 #define MCP_INTCCON AP 0x08 #define MCP_GPIO_0x09 #define ORAT_COOLT 代码#define 0#define #define #define #define #define #define 0x40 //0100A2A1 (01000000) void SPI_init (void); //初始化 SPI 通信 void SPI_SEND (UChar 数据); //发送 SPI 命令 void Timing_init (void); int main (void) { WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器 timing_init(); //设置定时 spi_init(); //初始化 SPI 模块 UCA1 while (1) { P3OUT &=~BIT2;// CS 设置为低电平 _DELAY_CYCLES (200); while ((UCA1IFG & UCTXIFG)==0); SPI_SEND (MCP_IODIR);//初始化 IODIR P3OUT |= BIT2;// CS 设置为高电平 _DELAY_CYCLES (200); P3OUT &=~BIT2;// CS 设置为低电平 _DELAY_CYCLES (200); while ((UCA1IFG & UCTXIFG)==0); SPI_SEND (操作码);//初始化操作码 P3OUT |= BIT2;// CS 设置为高电平 _DELAY_CYCLES (200); P3OUT &=~BIT2;// CS 设置为低电平 _DELAY_CYCLES (200); while ((UCA1IFG & UCTXIFG)==0); SPI_SEND (MCP_IODIR);//初始化 MCP_IODIR P3OUT |= BIT2;// CS 设置为高电平 _DELAY_CYCLES (200); P3OUT &=~BIT2;// CS 设置为低电平 _DELAY_CYCLES (200); while ((UCA1IFG & UCTXIFG)==0); SPI_SEND (0x00);//初始化0x00 LED0 P3OUT |= BIT2;// CS 设置为高电平 _DELAY_CYCLES (200); } } void SPI_init (void) { P2SEL1 |= BIT4; //选择 P2.4的辅助功能(UCA1CLK) P2SEL1 |= BIT5; //选择 P2.5的辅助功能(UCA1SIMO) P2SEL1 |= BIT6; //选择 P2.6的辅助功能(UCA1SOMI) P3DIR |= BIT2; //声明 P3.2为 Select Slave port P3OUT |= BIT2; //从 Select Slave P3.2以高电平开始 UCA1CTLW0 |= UCCKPH; //选择时钟相位到上升时钟相位 UCA1CTLW0 |= UCMSB; //移位寄存器的方向 UCA1CTLW0 |= UCMST; // SPI 主设备 UCA1CTLW0 |= UCSYNC; //同步模式使能 UCA1CTLW0 |= UCSSEL_2; //选择 SMCLK 时钟 UCA1CTLW0 |= UCSWRST; //软件复位使能。 必须在此处进行选择 UCA1CTL1 ^= UCSWRST; //软件复位禁用。 通过这种方式设置 UCSWRST = 0 } void SPI_send (UChar data) { // P3OUT &=~BIT2; //选择将 P3.2设置为低电平的从器件 UCA1TXBUF =数据; //发送数据 // P3OUT |= BIT2; //结束选择从器件并将 P3.2设置为高 电平} void Timing_init (void) { //设置时钟系统 CSCTL0 = CSKEY; //启用时钟系统 CSCTL1 = DCOFSEL_3; //频率= 8、0MHz CSCTL2 = SELA_XT1CLK | SELESS__DCOCLK | SELM_DCOCLK;//选择时钟源 CSCTL3 = DIVA__8 | DIVS__32 | DIVM__8; //设置分频器 CSCTL4 = XT2OFF | XTS | XT1DRIVE_0; // XT2被禁用、XT1:HF 模式、低功耗、无旁路 CSCTL0_H = 0; //禁用时钟系统 }
是否有人告诉我我我出了问题、或者告诉我可能忘记了什么。
我尝试学习数据表、但让该芯片正常工作并不方便。