[英]STM32F3 how to trigger ADC conversions on Timer and use circular DMA transfer
[英]How to use the MODBUS TCP with STM32F3?
作為大型研究的結果,我發現這個STM32f1 L此源代碼油墨和我改變它STM32f3。 以及構建並安裝到我的 STM32。 我的以太網電纜連接在我的電腦和 enc28j60 模塊之間。 如果我在main.c
和 while 循環中調試此代碼我的代碼堆棧:
while (1)
{
eMBPoll();
led_poll();
/* 從網絡設備讀取一個IP包,返回數據長度 */
uip_len = tapdev_read();
/* 收到數據 */
**if (uip_len > 0)**
{
/* 處理IP數據包 */
if (BUF->type == htons(UIP_ETHTYPE_IP))
{
uip_arp_ipin();
uip_input();
if (uip_len > 0)
{
uip_arp_out();
tapdev_send();
}
}
/* 處理ARP報文 */
else if (BUF->type == htons(UIP_ETHTYPE_ARP))
{
uip_arp_arpin();
if (uip_len > 0)
{
tapdev_send();
}
}
}
我卡住if (uip_len > 0)行,因為 uip_len 為該行返回 0:
(我的代碼與下面的 github 鏈接相同,所以我不共享所有代碼)
enc28j_60.c 中的 unsigned int enc28j60_packet_receive(unsigned char *packet, unsigned int maxlen) 函數:
unsigned int enc28j60_packet_receive(unsigned char *packet, unsigned int maxlen)
{
unsigned int rxstat;
unsigned int len;
if (enc28_read(EPKTCNT) == 0)
{
return (0);
}
enc28_write(ERDPTL, (next_pack_ptr));
enc28_write(ERDPTH, (next_pack_ptr) >> 8);
next_pack_ptr = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
next_pack_ptr |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;
len = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
len |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;
len -= 4;
rxstat = enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
rxstat |= enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;
if (len > maxlen - 1)
{
len = maxlen - 1;
}
**if ((rxstat & 0x80) == 0)
{
GPIO_SetBits(GPIOE, GPIO_Pin_9);
len = 0;
}**
else
{
des_enc28_readBuffer(packet, len);
}
enc28_write(ERXRDPTL, (next_pack_ptr));
enc28_write(ERXRDPTH, (next_pack_ptr) >> 8);
enc28_writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);
return (len);
}
為什么rxstat & 0x80) == 0 ? 我不明白。
根據ENC28J60 數據表,似乎RXSTAT
標志應該在位 12:
我不確定des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0)
是否正在閱讀正確的東西,但我相信你應該有類似的東西:
unsigned PHSTAT2 = des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0);
PHSTAT2 |= des_enc28_readOp(ENC28J60_READ_BUF_MEM, 0) << 8;
unsigned RXSTAT = (PHSTAT2 & 0x1000) != 0;
if (RXSTAT)
{
// RXSTAT flag is set
des_enc28_readBuffer(packet, len);
}
else
{
...
}
我還會將此寄存器的值轉儲到日志或串行端口,以確保您了解其實際內容:
// I noticed serialprint in your other question, so I am presuming this is your log func
serialprint("PHSTAT2 = 0x%04x\n", PHSTAT2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.