您好!
我使用 的是 具有串行接口的 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; //禁用时钟系统
}
是否有人告诉我我我出了问题、或者告诉我可能忘记了什么。
我尝试学习数据表、但让该芯片正常工作并不方便。